iconv () - Как определить необходимый размер для буфера вывода? [Дубликат]

0

В моем коде C++ мне нужно преобразовать строки Unicode в строки UTF-8 с помощью iconv(). Перед вызовом функции мне нужно выделить правильный размер буфера. Несколько примеров, которые я видел, перекрывают буфер (например, в два раза больше длины входной строки). Мне интересно, есть ли способ определить точный размер, который потребуется для преобразования. С уважением.

Теги:
utf-8

1 ответ

1
Лучший ответ

По сути, вы хотите сделать две вещи:

  1. Получите фактическую кодовую точку в каждом символе (если "Юникод" означает UTF-16, вам необходимо обрабатывать суррогатные пары соответственно)
  2. Определите, сколько байтов будет занимать точка кода в UTF-8.

Я предполагаю, что вы знаете, как сделать первый шаг, и сосредоточьтесь на втором шаге:

  • U + 0000..U + 007F = 1 байт
  • U + 0080..U + 07FF = 2 байта
  • U + 0800..U + FFFF = 3 байта
  • U + 10000..U + 1FFFFF = 4 байта *
  • U + 200000..U + 3FFFFFF = 5 байт *
  • U + 4000000..U + 7FFFFFFF = 6 байт *

* UTF-8 может кодировать 2147483648 кодовых точек [0... 0x7FFFFFFF], но UTF-16 может кодировать только первые 1114112 из них [0... 0x10FFFF], которые являются единственными, которые в настоящее время обозначены. В результате все, что находится за пределами U + 10FFFF, бессмысленно на момент написания этой статьи. Я включил остальных только для полноты.

  • 0
    Спасибо за ваше руководство. Я узнал что-то новое. Мой вход имеет тип wchar_t *. Это UTF-16 в Windows, но 4 байт в Linux. Из 4 байтов, U в вашем объяснении относится к первому байту? С уважением.
  • 0
    @Peter Нотация U + xxxx - это просто способ ссылки на кодовые точки Unicode. Например, U + 12AB - это кодовая точка 0x12AB. В Windows и, возможно, в других системах, таких как IBM AIX, где wchar_t - это UTF-16, вы захотите обрабатывать суррогатные пары при декодировании. Поскольку вы используете wchar_t, который может даже не быть UTF-16 или UTF-32 на некоторых платформах, вам, вероятно, лучше позволить библиотеке Unicode, такой как ICU, делать эту работу. Если вы работаете только с определенным набором платформ, на которых вы знаете поведение wchar_t, то во всех случаях используйте вместо этого iconv.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню