2016-03-26 4 views
1

У меня есть utf16 wchar_t *, который мне нужно преобразовать и выгрузить в utf8 char *. Я использую std :: wcstombs, чтобы сделать это, и использую длину wchar_t * для максимальной длины.Длина строки utf16 как строка utf8

Я немного расплывчатый на пути использования кодирования utf, хотя, IIRC, один символ может занимать несколько байтов, и в этом случае я мог бы потерять некоторые символы, когда делаю это так.

В настоящее время персонажи, которые могут возникнуть, довольно ограничены и, вероятно, подойдут даже в кодировке ASCII, но позже я планирую разрешить больше, например, öäõü и т.п. У меня проблема? Если да, как бы я измерил длину буфера, который мне нужно выделить?

+0

... И вопрос в том, что? Не совсем понятно, что вы просите. – 3442

+0

UTF-16 также имеет многосимвольные последовательности, так что это два или четыре байта на код, переводящий одинаково волатильное количество байтов в UTF-8. Кроме того, существует множество способов представления Umlauts в Unicode. –

ответ

3

Кодовые обозначения в BMP («Базовая многоязычная плоскость», то есть те, значения которых не превышают 0xFFFF) требуют одного кодового элемента UTF-16 или до трех кодовых элементов UTF-8. Вне BMP для кодовой точки требуются два кодовых модуля UTF-16 (суррогатная пара) или четыре кодовых модуля UTF-8.

Если ваш wchar_t имеет два байта (UTF-16), в худшем случае для строки UTF-8 может потребоваться три байта для отдельного wchar_t (что на 50% больше памяти) и 4 байта для суррогатной пары (то же количество памяти).

Если ваш wchar_t имеет четыре байта (UTF-32), то для символов, отличных от BMP, потребуется только один wchar_t, поэтому наихудший случай - четыре байта для каждого wchar_t, который представляет собой тот же объем памяти.

Только один байт для каждого wchar_t обязательно вызовет у вас проблемы. Это будет работать, только если у вас нет символов вне основного набора символов ASCII.

Смежные вопросы