我在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?
U + 2008A是Han character,它不在二进制多语言窗格中,所以应该用UTF-16中的代理对来表示。这意味着 - 如果我理解正确 - 它应该由两个wchar_t字符表示。所以我期望sizeof(s2)为6(代理对的两个wchar_t-s为4,终止\ 0为2)。
那么为什么sizeof(s2)== 4?我测试了s2字符串是否已正确构造,因为我使用DirectWrite渲染它,汉字字符显示正确。
更新:正如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.
答案 0 :(得分:8)
sizeof(s2)
返回存储指针s2
或任何其他指针所需的字节数,即系统上的4个字节。它与s2
指向的中存储的字符无关。
答案 1 :(得分:4)
sizeof(wchar_t*)
与sizeof(void*)
相同,换句话说就是指针本身的大小。在32位系统上总是4,在64位系统上总是8。您需要使用wcslen()
或lstrlenW()
代替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
答案 2 :(得分:0)
答案的附录。
RE:通过i1
和i2
,i3
解开问题更新中使用的不同单位。
i1
值为2是字节中的大小
i2
值为1是 wchar_t 中的大小,IOW为4个字节(假设sizeof(wchar_t)
为4)。
i3
值为2是 wchar_t 中的大小,IOW 8字节