Наименьшие кодировки в Юникоде для разных языков?
-
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 байта на символ и поэтому предлагает произвольный доступ.Но это зависит от того, что вы подразумеваете под "Юникодом".
UTF-8
В JoelOnSoftware есть очень хорошая статья о unicode: