как \U0001F609
стало 3d d8 09 de
?
wchar_t
является 16-битным в Windows, но 0x1F609 > UINT16_MAX
, поэтому так называемые суррогатные пары используются для кодирования кодовой точки в две кодовые единицы по 16 бит в каждой.
Из Википедия :
- 0x10000 вычитается из кодовой точки, оставляя 20-битное число в
диапазон 0x00000–0xFFFFF. (
0x1F609 - 0x10000 = 0xF609
)
- Старшие десять битов (в диапазоне 0x000–0x3FF) добавляются к 0xD800 для
дать первый 16-битный кодовый блок или старший суррогат, который будет в
диапазон 0xD800–0xDBFF. (
0xD800 + 0x3D
)
- Младшие десять битов (также в диапазоне 0x000–0x3FF) добавляются к 0xDC00
дать второй 16-битный кодовый блок или низкий суррогат, который будет
в диапазоне 0xDC00–0xDFFF. (
0xDC00 + 0x209
)
Что оставляет 0xD83D 0xDE09
. Кодирование в виде двух младших порядковых 16-битных кодовых единиц дает 3D D8 09 DE
.
как мне преобразовать универсальное имя символа в последовательность wchar_ts?
«Универсальное имя символа» - это кодовая точка Unicode. wchar_t
на окнах - UTF-16.
Какой WinAPI мне нужен для этого преобразования?
Я не знаю, есть ли какие-либо API-интерфейсы специально для этого, но довольно просто написать свой собственный конвертер UTF-32 * в UTF-16. Посетите страницу Википедии для получения дополнительной информации
*: поскольку 32-разрядный код достаточно большой, чтобы вместить весь код Unicode, каждая кодовая точка может быть закодирована в одну кодовую единицу UTF-32.