Наименьшие кодировки в Юникоде для разных языков?

StackOverflow https://stackoverflow.com/questions/92073

  •  01-07-2019
  •  | 
  •  

Вопрос

Каковы типичные средние значения байт на символ для разных кодировок Unicode на разных языках?

Например.если бы я хотел, чтобы наименьшее количество байтов кодировало какой-либо текст на английском языке, то в среднем UTF-8 составлял бы 1 байт на символ, а UTF-16 - 2, поэтому я бы выбрал UTF-8.

Если бы мне нужен был текст на корейском, то UTF-16 мог бы составлять в среднем около 2 символов на символ, а UTF-8 мог бы составлять в среднем около 3 (я не знаю, я просто привожу здесь несколько иллюстративных цифр).

Какие кодировки предъявляют наименьшие требования к памяти для разных языков и наборов символов?

Это было полезно?

Решение

Для любого данного языка скорость передачи байтов на символ довольно постоянна, поскольку большинство языков распределены по смежным кодовым страницам.Большим исключением являются латинские символы с ударением, которые расположены выше в кодовом пространстве, чем формы без акцента.У меня нет точных цифр для этих целей.

Для языков с непрерывным распределением символов существует таблица с подробными номерами для различных языков в Википедии.В целом, UTF-8 хорошо работает для большинства небольших наборов символов (за исключением тех, которые выделяются на больших кодовых страницах), а UTF-16 отлично подходит для двухбайтовых наборов символов.

Если вам нужно более плотное сжатие, вы также можете посмотреть на Техническое примечание 14 к Юникоду, в котором сравниваются некоторые специальные кодировки, предназначенные для уменьшения размера данных для различных языков.Но эти методы не особенно распространены.

Другие советы

Если вас действительно беспокоит размер строки / символа, вы думали о том, чтобы сжать их?Это автоматически уменьшило бы строку до "минимальной" кодировки.Это серьезная головная боль, особенно если вы хотите сделать это в памяти, и есть множество случаев, когда это вам ничего не даст, но кодирование, в частности, имеет тенденцию быть слишком универсальным для того уровня компактности, к которому вы, кажется, стремитесь.

UTF8 лучше всего подходит для любого набора символов, где символы в основном ниже U +0800.В противном случае UTF16.

То есть UTF8 для латиницы, греческого, кириллицы, иврита и арабского и некоторых других.На языках, отличных от латиницы, символы будут занимать столько же места, сколько и в UTF16, но вы сэкономите байты на знаках препинания и интервалах.

В UTF-16 все языки, которые имеют значение (т.е.все, кроме клингонов, эльфов и других странных вещей) будет закодировано в 2-байтовые символы.

Итак, вопрос в том, чтобы найти языки, которые будут содержать глифы длиной в 2 байта или 1 байт.

На странице Википедии в UTF-8:http://en.wikipedia.org/wiki/Utf-8

Мы видим, что символ с индексом юникода 0x0800 или более будет иметь длину не менее 3 байт в UTF-8.

Зная это, вам просто нужно взглянуть на диаграммы кода в Unicode: http://www.unicode.org/charts/

для языков, соответствующих вашим требованиям.

:-)

Теперь обратите внимание, что, в зависимости от используемого вами фреймворка, выбор вполне может быть не за вами:

  • В Windows API Юникод обрабатывается символами wchar_t и имеет формат UTF-16
  • В Linux Юникод обрабатывается с помощью символа char и имеет формат UTF-8
  • Java внутренне использует UTF-16, как и большинство совместимых XML-анализаторов
  • Мне сказали (о какой-то технической встрече, которая меня не интересовала...извините ...), что UTF-8 был кодировкой выбора в базах данных.

Так что забирай свой яд...

:-)

Я не знаю точных цифр, но для японского языка Shift_JIS в среднем меньше байт на символ, чем UTF-8, как и EUC-JP, поскольку они оптимизированы для японского текста.Однако они не охватывают то же пространство кодовых точек, что и Unicode, поэтому могут быть неправильными ответами на ваш вопрос.

UTF-16 лучше, чем UTF-8 для японских символов (2 байта на символ вместо 3), но хуже, чем UTF-8, если в нем много 7-битных символов.Это зависит от контекста - технический текст, скорее всего, будет содержать много символов в диапазоне в 1 байт.В классическом японском тексте их может и не быть.

Обратите внимание, что для транспортировки кодировка не имеет большого значения, если вы можете заархивировать данные (gzip, bz2).Кодовые точки для алфавита в Юникоде расположены близко друг к другу, поэтому вы ожидаете, что в сжатых данных будут использоваться общие префиксы с очень короткими представлениями.

UTF-8 обычно хорош для представления в памяти, поскольку он часто более компактен, чем UTF-32 или UTF-16, и совместим с функциями в char *, которые "ожидают" строки ASCII или ISO-8859-1, заканчивающиеся нулем.Однако это бесполезно, если вам нужен произвольный доступ к символам по индексу.

Если вас не интересуют символы, отличные от BMP, UCS-2 всегда имеет размер 2 байта на символ и поэтому предлагает произвольный доступ.Но это зависит от того, что вы подразумеваете под "Юникодом".

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top