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?
谢谢
在大多数Unix下(Mac OS X也是如此),whar_t代表UTF-32单一代码点,而不是像windows一样16bit utf-16点.
所以你需要:
或者:
ws.assing(arr,arr + length_of_string);
Run Code Online (Sandbox Code Playgroud)
这将使用arr作为迭代器并将每个short int复制到wchar_t.但是,只有当您的角色位于BMP或代表UCS-2(16位传统编码)时,这才有效.
或者,正确使用utf-16:将utf-16转换为utf-32 - 您需要找到代理对并将它们合并到单个代码点.
| 归档时间: |
|
| 查看次数: |
4597 次 |
| 最近记录: |