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

标签 c++ unicode wstring

大多数关于 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/

相关文章:

c++ - 是否可以使用 highgui/opencv 在视频序列上显示文本?

c++ - 在调用/连接 LPCWSTR 后定义 wstring

c++ - 求 istreambuf_iterator <wchar_t> 澄清,读取 Unicode 字符的完整文本文件

c++ - 旋转顶点数组对象不起作用

c++ - 如何在 OpenGL 中更好地制作 2D 光照

Python __str__ 与 __unicode__

python - 使用 ast.literal_eval 时出现格式错误的字符串

unicode - toLowerCase 和标准化的排序可以吗?

c++ - 将 std::wstring 转换为 SQLWCHAR *

c++:为什么在这里调用构造函数