Размер wchar _t *для суррогатной пары (Символ Unicode из BMP )в Windows

Я столкнулся с интересной проблемой в Windows 8. Я проверил, могу ли я представлять символы Unicode, которые находятся вне BMP, с помощью строк wchar _t *. Следующий тестовый код дал мне неожиданные результаты:

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 — это ханьский символ , который находится за пределами бинарной многоязычной панели, поэтому он должен быть представлен суррогатной парой в UTF -16. Что означает -, если я правильно понимаю. -что он должен быть представлен двумя символами wchar _t. Поэтому я ожидал, что sizeof (s2 )будет 6 (4 для двух wchar _t -s суррогатной пары и 2 для завершающего \0 ).

Так почему же sizeof (s2 )== 4? Я проверил правильность построения строки s2, потому что я визуализировал ее с помощью DirectWrite, и символ Han отображался правильно.

ОБНОВЛЕНИЕ :Как указал Навин, я пытался неправильно определить размер массивов. Следующий код дает правильный результат:

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.

5
задан Mark Vincze 19 July 2012 в 18:58
поделиться