Наименьшая кодировка Unicode для разных языков? - PullRequest
2 голосов
/ 18 сентября 2008

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

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

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

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

Ответы [ 6 ]

2 голосов
/ 18 сентября 2008

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

2 голосов
/ 18 сентября 2008

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

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

2 голосов
/ 18 сентября 2008

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

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

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

1 голос
/ 18 сентября 2008

Я не знаю точных цифр, но для японского языка 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 с NUL-завершением строки. Однако бесполезно, если вам нужен произвольный доступ к символам по индексу.

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

1 голос
/ 18 сентября 2008

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

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

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

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

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

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

: -)

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

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

Итак, возьми свой яд ...

: -)

0 голосов
...