Windows上代理项对(BMP中的Unicode字符)的wchar_t *大小

时间:2012-07-16 12:05:41

标签: 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?

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.

3 个答案:

答案 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:通过i1i2i3解开问题更新中使用的不同单位。

i1值为2是字节中的大小 i2值为1是 wchar_t 中的大小,IOW为4个字节(假设sizeof(wchar_t)为4)。
i3值为2是 wchar_t 中的大小,IOW 8字节