Как преобразовать целое число в символ Unicode? - PullRequest
0 голосов
/ 04 июня 2019

Итак, я хотел попробовать преобразовать Unicode в целое число для моего проекта.Я пробовал что-то вроде этого:

 unsigned int foo = (unsigned int)L'آ'; 
 std::cout << foo << std::endl;

Как мне конвертировать обратно?Или, другими словами, Как мне преобразовать int в соответствующий символ Unicode?

EDIT: я ожидаю, что вывод будет значением Unicode целого числа, например:

cout << (wchar_t) 1570 ; // This should print the unicode value of 1570 (which is :آ)

Я использую сообщество Visual Studio 2013 с компилятором по умолчанию, 64-разрядная версия Windows 10 Pro

Приветствия

1 Ответ

3 голосов
/ 04 июня 2019

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...