gpt4 book ai didi

C++ wstring 如何从 NULL 终止的 wchar_t 数组分配

转载 作者:太空宇宙 更新时间:2023-11-04 14:43:00 24 4
gpt4 key购买 nike

大多数关于 C++ 标准库的文本提到 wstring 等同于 string,除了在 wchar_t 而不是 char 上参数化,然后继续仅演示 string。

好吧,有时会有一些特殊的怪癖,这里有一个:我似乎无法从一个以 NULL 结尾的 16 位字符数组中分配一个 wstring。问题是赋值愉快地使用空字符和任何垃圾作为实际字符。这是一个非常小的减少:

typedef unsigned short PA_Unichar;
PA_Unichar arr[256];
fill(arr); // sets to 52 00 4b 00 44 00 61 00 74 00 61 00 00 00 7a 00 7a 00 7a 00
// now arr contains "RKData\0zzz" in its 10 first values
wstring ws;
ws.assign((const wchar_t *)arr);
int l = ws.length();

此时 l 不是预期的 6(“RKData”中的字符数),而是大得多。在我的测试运行中,它是 29。为什么是 29?不知道。内存转储未显示第 29 个字符的任何特定值。

所以问题是:这是我的标准 C++ 库 (Mac OS X Snow Leopard) 中的错误,还是我的代码中的错误?我应该如何将一个以 null 结尾的 16 位字符数组分配给 wstring?

谢谢

最佳答案

在大多数 Unix(以及 Mac OS X)下,whar_t 表示 UTF-32 单个代码点,而不是像在 Windows 上那样的 16 位 utf-16 点。

所以你需要:

  1. 要么:

    ws.assing(arr,arr + length_of_string);

    这将使用 arr 作为迭代器并将每个 short int 复制到 wchar_t。但这仅当您的角色位于 BMP 中或代表 UCS-2 时才有效(16 位传统编码)。

  2. 或者,正确地使用 utf-16:将 utf-16 转换为 utf-32——您需要找到代理对并将它们合并到单个代码点。

关于C++ wstring 如何从 NULL 终止的 wchar_t 数组分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1340577/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com