Как преобразовать из «универсального имени символа» в последовательность wchar_t? - PullRequest
0 голосов
/ 27 октября 2018

В моем приложении мне нужно иметь возможность анализировать строковые литералы, поддерживаемые стандартом C ++ 14.Поэтому я читаю эту статью на эту тему и пытаюсь понять, как мне преобразовать из universal character name в последовательность wchar_t s?

Позвольте мнеобъясните с этим примером.Скажем, если я скомпилирую следующее с VS 2017:

const wchar_t* str2 = L"\U0001F609 is ;-)";

str2 станет следующей последовательностью байтов в памяти:

enter image description here

Так как же \U0001F609 стал 3d d8 09 de?Или какой WinAPI мне нужен для этого преобразования?

1 Ответ

0 голосов
/ 27 октября 2018

как \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.

...