L'آ'
будет нормально работать в качестве широкого символа, потому что он ниже 0xFFFF
.Но в целом UTF16 включает суррогатные пары, поэтому кодовая точка Unicode не может быть представлена одним широким символом.Вместо этого вам нужна широкая строка.
Ваша проблема также частично связана с печатью символа UTF16 в консоли Windows.Если вы используете MessageBoxW
для просмотра широкой строки, она будет работать как положено:
wchar_t buf[2] = { 0 };
buf[0] = 1570;
MessageBoxW(0, buf, 0, 0);
Однако, как правило, вам нужна широкая строка для учета суррогатных пар, а не один широкий символ.Пример:
int utf32 = 1570;
const int mask = (1 << 10) - 1;
std::wstring str;
if(utf32 < 0xFFFF)
{
str.push_back((wchar_t)utf32);
}
else
{
utf32 -= 0x10000;
int hi = (utf32 >> 10) & mask;
int lo = utf32 & mask;
hi += 0xD800;
lo += 0xDC00;
str.push_back((wchar_t)hi);
str.push_back((wchar_t)lo);
}
MessageBox(0, str.c_str(), 0, 0);
См. Связанные посты для печати UTF16 в консоли Windows.