MultiByteToWideChar - и кодировка UTF-16 и размер wchar_t

Подскажите пожалуйста, вот есть WinApi-шная функция: MultiByteToWideChar, которая преобразовывает входной буфер, пусть в данном случае будет UTF-8 в UTF-16.

То есть на вход я подаю массив char`ов в кодировке UTF-8 и соответственно так же подаю массив wchar_t для получения туда результата преобразования, но так как заранее размер массива после преобразования я знать не могу, то у функции предусмотрен вызов с нулевым последним параметром и тогда MultiByteToWideChar вернет кол-во Символов UTF-16, которое будет после преобразование моей строки UTF-8.

И вот чего я не совсем могу понять: UTF-16, как и UTF-8 - это кодировка переменной длинны, только с размером по 2 байта и вот вопрос: а если я на вход подам такой символ, который занимает в UTF-16 Более двух байт, то есть 4 байта ??

Как это все соотносится с размером wchat_t на Виндоус в 2 байта ??


Ответы (1 шт):

Автор решения: KoVadim

Если Ваш символ нельзя просто так закодировать в 2 байта, то в Windows используются суррогатные пары. То есть, такие символы будут закодированы двумя двубайтовыми элементами.

цитата с википедии

Символы же в диапазоне 1000016..10FFFF16 (больше 16 бит) кодируются по следующей схеме:

Из кода символа вычитается 10000. В результате получится значение от нуля до FFFFF, которое помещается в разрядную сетку 20 бит.
Старшие 10 бит (число в диапазоне 0000..03FF) суммируются с D800, и результат идёт в ведущее (первое) слово, которое входит в диапазон D800..DBFF.
Младшие 10 бит (тоже число в диапазоне 0000..03FF) суммируются с DC00, и результат идёт в последующее (второе) слово, которое входит в диапазон DC00..DFFF.
→ Ссылка