Mar*_*cze 5 c++ windows unicode utf-16
我在Windows 8上遇到了一个有趣的问题.我测试过我可以使用wchar_t*字符串表示不在BMP中的Unicode字符.以下测试代码为我产生了意想不到的结果:
const wchar_t* s1 = L"a";
const wchar_t* s2 = L"\U0002008A"; // The "Han" character
int i1 = sizeof(wchar_t); // i1 == 2, the size of wchar_t on Windows.
int i2 = sizeof(s1); // i2 == 4, because of the terminating '\0' (I guess).
int i3 = sizeof(s2); // i3 == 4, why?
Run Code Online (Sandbox Code Playgroud)
U + 2008A是Han字符,它不在Binary Multilingual Pane中,所以它应该用UTF-16中的代理对表示.这意味着 - 如果我理解正确 - 它应该由两个wchar_t字符表示.所以我期望sizeof(s2)为6(代理对的两个wchar_t-s为4,终止\ 0为2).
那么为什么sizeof(s2)== 4?我测试了s2字符串是否已正确构造,因为我使用DirectWrite渲染它,并且Han字符显示正确.
更新:正如Naveen指出的那样,我试图错误地确定数组的大小.以下代码生成正确的结果:
const wchar_t* s1 = L"a";
const wchar_t* s2 = L"\U0002008A"; // The "Han" character
int i1 = sizeof(wchar_t); // i1 == 2, the size of wchar_t on Windows.
std::wstring str1 (s1);
std::wstring str2 (s2);
int i2 = str1.size(); // i2 == 1.
int i3 = str2.size(); // i3 == 2, because two wchar_t characters needed for the surrogate pair.
Run Code Online (Sandbox Code Playgroud)
sizeof(wchar_t*)与 相同sizeof(void*),换句话说就是指针本身的大小。在 32 位系统上始终为 4,在 64 位系统上始终为 8。您需要使用wcslen()orlstrlenW()代替sizeof():
const wchar_t* s1 = L"a";
const wchar_t* s2 = L"\U0002008A"; // The "Han" character
int i1 = sizeof(wchar_t); // i1 == 2
int i2 = wcslen(s1); // i2 == 1
int i3 = wcslen(s2); // i3 == 2
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5171 次 |
| 最近记录: |