我在 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 字符,它不在 Binary Multilingual Pane 中,因此它应该由 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.