Ответ заключается в том, что в 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. Значение каждого из столбцов следующее:
- Paras - количество разделенных пробелами текстовых интервалов.
- Lines - количество разделенных переводом строки строк текста.
- Слова - это количество разделенных пробелами текстовых полей.
- Графики - это число расширенных графических кластеров Unicode, иногда называемых глифами. Это видимые пользователю символы.
- Chars - количество кодовых точек Unicode. Это или должны быть видимые программисту символы.
- UTF16 - это количество байтов, которое занимает, когда файл сохраняется как UTF-16.
- UTF8 - это количество байтов, которое занимает, когда файл сохраняется как UTF-8.
- 8: 16 - это отношение размера UTF-8 к размеру UTF-16, выраженное в процентах.
- 16: 8 - это отношение размера UTF-16 к размеру UTF-8, выраженное в процентах.
- Язык - это та версия страницы Токио, о которой мы здесь говорим.
Я сгруппировал языки на западную латынь, западную нелатинскую и восточную. Замечания:
Западные языки, использующие латинский алфавит, ужасно страдают при конвертации из UTF-8 в UTF-16, при этом английский страдает больше всего, увеличившись на 96%, а венгерский - меньше всего, увеличившись на 80%. Все огромные.
Западные языки, которые не используют латинский алфавит, по-прежнему страдают, но только на 15-20%.
Восточные языки НЕ ПОТЕРЯЙТЕ в 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. Только когда вы берете отдельные кодовые точки, вы когда-либо видите такие цифры, что является совершенно необоснованным показателем.