C++ wstring如何从以NULL结尾的wchar_t数组赋值

Jea*_*uys 0 c++ unicode wstring

C++标准库中的大多数文本都提到wstring等同于string,除了在wchar_t而不是char上进行参数化,然后继续演示字符串.

好吧,有时,有一些特定的怪癖,这里有一个:我似乎无法从一个以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();
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢

Art*_*yom 9

在大多数Unix下(Mac OS X也是如此),whar_t代表UTF-32单一代码点,而不是像windows一样16bit utf-16点.

所以你需要:

  1. 或者:

    ws.assing(arr,arr + length_of_string);
    
    Run Code Online (Sandbox Code Playgroud)

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

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