всегда текст, закодированный в UTF-8, никогда не даст нам более + 50% размера файла того же текста, закодированного в UTF-16. правда / ложь? - PullRequest
4 голосов
/ 30 июля 2011

Где-то я прочитал (перефразировал):

Если мы сравним файл в кодировке UTF-8 с файлом в кодировке UTF-16, Иногда файл UTF-8 может давать 50%на 100% больше размер файла

Правильно ли я могу сказать, что статья неверна, потому что всегда , текст, закодированный в UTF-8, будет никогда дать нам более + 50% размера файла того же текста, закодированного в UTF-16?

Ответы [ 4 ]

26 голосов
/ 30 июля 2011

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

Обычные восточные языки требуют для своих символов 3 байта в UTF-8, но 2 в UTF-16. Обратите внимание, что для «необычных» восточных символов требуется 4 байта как в UTF-8, так и в UTF-16.

3 действительно только на 50% больше, чем 2. Но это только для одной кодовой точки. Это не относится ко всему файлу.

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

Эти вещи меняются. Вы можете получить точные цифры только на точном тексте, а не на общем тексте. Кодовые точки в азиатском тексте занимают 1, 2, 3 или 4 байта UTF-8, в то время как в UTF-16 они по-разному требуют по 2 или 4 байта.

Пример использования

Сравните страницы Википедии на разных языках в Токио, чтобы понять, что я имею в виду. Даже на восточных языках все еще существует множество ASCII. Одно это заставляет колебаться ваши цифры. Рассмотрим:

Paras Lines Words Graphs Chars  UTF16 UTF8   8:16 16:8  Language

 519  1525  6300  43120 43147  86296 44023   51% 196%  English
 343   728  1202   8623  8650  17302  9173   53% 189%  Welsh
 541  1722  9013  57377 57404 114810 59345   52% 193%  Spanish
 529  1712  9690  63871 63898 127798 67016   52% 191%  French
 321   837  2442  18999 19026  38054 21148   56% 180%  Hungarian

 202   464   976   7140  7167  14336 11848   83% 121%  Greek
 348   937  2938  21439 21467  42936 36585   85% 117%  Russian

 355   788   613   6439  6466  12934 13754  106%  94%  Chinese, simplified
 209   419   243   2163  2190   4382  3331   76% 132%  Chinese, traditional
 461  1127  1030  25341 25368  50738 65636  129%  77%  Japanese
 410   925  2955  13942 13969  27940 29561  106%  95%  Korean

Каждая из них - это страница Токио Википедия , сохраненная как текст, , а не как HTML. Весь текст в NFC, а не в NFD. Значение каждого из столбцов следующее:

  1. Paras - количество разделенных пробелами текстовых интервалов.
  2. Lines - количество разделенных переводом строки строк текста.
  3. Слова - это количество разделенных пробелами текстовых полей.
  4. Графики - это число расширенных графических кластеров Unicode, иногда называемых глифами. Это видимые пользователю символы.
  5. Chars - количество кодовых точек Unicode. Это или должны быть видимые программисту символы.
  6. UTF16 - это количество байтов, которое занимает, когда файл сохраняется как UTF-16.
  7. UTF8 - это количество байтов, которое занимает, когда файл сохраняется как UTF-8.
  8. 8: 16 - это отношение размера UTF-8 к размеру UTF-16, выраженное в процентах.
  9. 16: 8 - это отношение размера UTF-16 к размеру UTF-8, выраженное в процентах.
  10. Язык - это та версия страницы Токио, о которой мы здесь говорим.

Я сгруппировал языки на западную латынь, западную нелатинскую и восточную. Замечания:

  1. Западные языки, использующие латинский алфавит, ужасно страдают при конвертации из UTF-8 в UTF-16, при этом английский страдает больше всего, увеличившись на 96%, а венгерский - меньше всего, увеличившись на 80%. Все огромные.

  2. Западные языки, которые не используют латинский алфавит, по-прежнему страдают, но только на 15-20%.

  3. Восточные языки НЕ ПОТЕРЯЙТЕ в UTF-8 так, как все утверждают, что они делают! Вот:

    • В корейском и (упрощенном) китайском языках вы получаете только на 6% больше в UTF-8, чем в UTF-16.
    • В японском UTF-8 на 29% больше, чем в UTF-16.
    • Традиционный китайский на самом деле стал меньше в UTF-8, чем в UTF-16! На самом деле, использование UTF-16 вместо UTF-8 для этого образца стоит 32%. Если вы посмотрите на столбцы «Линии и слова», то это может быть связано с использованием пробелов.

Надеюсь, это ответит на ваш вопрос. Просто нет увеличения от + 50% до + 100% для восточных языков при кодировании в UTF-8 по сравнению с тем же текстом, кодированным в UTF-16. Только когда вы берете отдельные кодовые точки, вы когда-либо видите такие цифры, что является совершенно необоснованным показателем.

10 голосов
/ 10 августа 2011

Да, вы правы. Кодовые точки в диапазоне U + 0800..U + FFFF дают размер + 50%.

                   UTF-8   UTF-16
U+0000..U+007F       1        2
U+0080..U+07FF       2        2
U+0800..U+FFFF       3        2
U+010000..U+10FFFF   4        4
2 голосов
/ 30 июля 2011

В UTF-8 каждая кодовая точка от 0 до 127 сохраняется в однобайтовом .Только кодовые точки 128 и выше сохраняются с использованием 2, 3, фактически до 6 байтов.

Хотя символы UTF-8 могут использовать до 4 байтов (и больше теоретически возможно), этоне используется для базовой многоязычной плоскости , которая включает в себя «почти все современные языки».

Для оставшейся части базовой многоязычной плоскости (которая содержит практически все символы общего пользования) требуется три байта.Четыре символа необходимы для символов в других плоскостях Unicode, которые включают в себя менее распространенные символы CJK и различные исторические сценарии.

Так что я предполагаю, что 100% -ые издержки, хотя теоретически возможны, не возможны сТипичный современный язык.Для достижения этой цели вам понадобится что-то экзотическое из дополнительной многоязычной плоскости, которая использует 4 байта в UTF-8.

Для документов HTML или смешанного текста может быть необязательно переходить на UTF-16для экономии места:

Символы от U + 0800 до U + FFFF используют три байта в UTF-8, но только два байта в UTF-16.В результате текст на (например) китайском, японском или хинди может занять больше места в UTF-8, если этих символов больше, чем символов ASCII.Это происходит для чистого текста, но редко для документов HTML.Например, как статьи UTF-8 на японском языке, так и статьи на хинди Юникод в Википедии занимают больше места, если сохраняются как UTF-16, чем оригинальная версия UTF-8.

См. UTF-8сравнение с UTF-16 в Википедии .


Джоэл Спольски написал отличную статью о Unicode, я действительно могу порекомендовать ее:

Абсолютный минимум для каждого разработчика программного обеспеченияАбсолютно, положительно должен знать о Unicode и наборах символов (без оправданий!)

0 голосов
/ 30 июля 2011

Если у вас есть один байт для символа и вы добавите второй байт, я бы назвал это увеличением на 100%, а не на 50%. Я думаю, что это имеет в виду автор.

Если я напишу X символов с N байтами / символами в файл, у меня будет NX байтов в этом файле. Таким образом, вы можете видеть, где удвоение или утроение количества байтов на символ будет линейно влиять на размер файла.

...