Вопрос

В чем разница между UTF-8, UTF-16 и UTF-32?

Я понимаю, что все они будут хранить Unicode и что каждый из них использует разное количество байтов для представления символа.Есть ли преимущество в выборе одного перед другим?

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

Решение

UTF-8 имеет преимущество в случае, когда символы ASCII представляют большинство символов в блоке текста, поскольку UTF-8 кодирует все символы в 8 бит (например, ASCII).Преимущество также состоит в том, что файл UTF-8, содержащий только символы ASCII, имеет ту же кодировку, что и файл ASCII.

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

UTF-32 охватывает все возможные символы размером 4 байта.Это делает его довольно раздутым.Я не могу придумать никаких преимуществ от его использования.

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

Суммируя:

  • UTF-8:Кодирование переменной ширины, обратно совместимое с ASCII.Символы ASCII (от U+0000 до U+007F) занимают 1 байт, кодовые точки от U+0080 до U+07FF занимают 2 байта, кодовые точки от U+0800 до U+FFFF занимают 3 байта, кодовые точки от U+10000 до U+10FFFF возьмем 4 байта.Хорошо подходит для текста на английском языке, но не очень хорош для текста на азиатском языке.
  • UTF-16:Кодирование переменной ширины.Кодовые точки от U+0000 до U+FFFF занимают 2 байта, кодовые точки от U+10000 до U+10FFFF занимают 4 байта.Плохо для английского текста, хорошо для азиатского текста.
  • UTF-32:Кодирование фиксированной ширины.Все кодовые точки занимают четыре байта.Огромный объем памяти, но с ним быстро работать.Редко используемый.

В долгосрочном плане:см. Википедию: UTF-8, UTF-16, и UTF-32.

  • UTF-8 является переменной от 1 до 4 байты.

  • UTF-16 является переменной 2 или 4 байты.

  • UTF-32 исправлен 4 байты.

Unicode определяет один огромный набор символов, присваивая одно уникальное целочисленное значение каждому графическому символу (это серьезное упрощение и на самом деле неверное, но оно достаточно близко для целей этого вопроса).UTF-8/16/32 — это просто разные способы кодирования.

Короче говоря, UTF-32 использует 32-битные значения для каждого символа.Это позволяет им использовать код фиксированной ширины для каждого символа.

UTF-16 по умолчанию использует 16-битный код, но это дает вам только 65 тысяч возможных символов, чего недостаточно для полного набора Unicode.Поэтому некоторые символы используют пары 16-битных значений.

А UTF-8 по умолчанию использует 8-битные значения, что означает, что 127 первых значений представляют собой однобайтовые символы фиксированной ширины (самый старший бит используется для обозначения того, что это начало многобайтовой последовательности, оставляя 7 биты для фактического значения символа).Все остальные символы кодируются последовательностями длиной до 4 байт (если память не изменяет).

И это приводит нас к преимуществам.Любой символ ASCII напрямую совместим с UTF-8, поэтому для обновления устаревших приложений UTF-8 является распространенным и очевидным выбором.Почти во всех случаях он также будет использовать меньше всего памяти.С другой стороны, вы не можете дать никаких гарантий относительно ширины символа.Его ширина может составлять 1, 2, 3 или 4 символа, что затрудняет манипулирование строками.

UTF-32 — наоборот, он использует больше всего памяти (каждый символ имеет фиксированную ширину в 4 байта), но с другой стороны, вы знать что каждый символ имеет эту точную длину, поэтому манипулирование строками становится намного проще.Вы можете вычислить количество символов в строке, просто исходя из длины строки в байтах.Вы не можете сделать это с UTF-8.

UTF-16 — это компромисс.Это позволяет большинство символы помещаются в 16-битное значение фиксированной ширины.Поэтому, пока у вас нет китайских символов, музыкальных нот или чего-то еще, вы можете считать, что каждый символ имеет ширину 16 бит.Он использует меньше памяти, чем UTF-32.Но в некотором смысле это «худшее из обоих миров».Он почти всегда использует больше памяти, чем UTF-8, и все же не избегает проблемы, связанной с UTF-8 (символы переменной длины).

Наконец, часто бывает полезно просто использовать то, что поддерживает платформа.Windows использует UTF-16 внутри себя, поэтому для Windows это очевидный выбор.

Linux немного отличается, но обычно они используют UTF-8 для всего, что совместимо с Unicode.

Итак, краткий ответ:Все три кодировки могут кодировать один и тот же набор символов, но они представляют каждый символ как разные последовательности байтов.

Юникод это стандарт и примерно UTF-х вы можете думать как о технической реализации для некоторых практических целей:

  • UTF-8 - "оптимизирован размер":лучше всего подходит для данных на основе латинских символов (или ASCII), он занимает всего 1 байт на символ, но размер увеличивается соответственно разнообразию символов (и в худшем случае может вырасти до 6 байт на символ)
  • UTF-16 - "баланс":требуется минимум 2 байта на символ, что достаточно для существующего набора основных языков с фиксированным размером, чтобы облегчить обработку символов (но размер по-прежнему является переменным и может увеличиваться до 4 байтов на символ)
  • UTF-32 - "производительность":позволяет использовать простые алгоритмы благодаря символам фиксированного размера (4 байта), но с недостатком памяти

Я попытался дать простое объяснение в своем Сообщение блога.

UTF-32

для кодирования требуется 32 бита (4 байта) любой характер.Например, чтобы представить кодовую точку символа «А» с помощью этой схемы, вам нужно будет записать 65 в 32-битном двоичном числе:

00000000 00000000 00000000 01000001 (Big Endian)

Если вы присмотритесь повнимательнее, вы заметите, что самые правые семь битов на самом деле являются одними и теми же битами при использовании схемы ASCII.Но поскольку UTF-32 схема с фиксированной шириной, мы должны присоединить три дополнительных байта.Это означает, что если у нас есть два файла, которые содержат только символ «A», один в кодировке ASCII, а другой в кодировке UTF-32, их размер будет составлять 1 байт и 4 байта соответственно.

UTF-16

Многие люди думают, что, поскольку UTF-32 использует фиксированную ширину в 32 бита для представления кодовой точки, UTF-16 имеет фиксированную ширину в 16 бит.НЕПРАВИЛЬНЫЙ!

В UTF-16 кодовая точка может быть представлена ​​либо в 16 битах, либо в 32 битах.Итак, эта схема представляет собой систему кодирования переменной длины.В чем преимущество перед UTF-32?По крайней мере, для ASCII размер файлов не будет превышать исходный в 4 раза (но все же в два раза), поэтому мы по-прежнему не имеем обратной совместимости с ASCII.

Поскольку для представления символа «А» достаточно 7 бит, теперь мы можем использовать 2 байта вместо 4, как в UTF-32.Это будет выглядеть так:

00000000 01000001

UTF-8

Вы угадали..В UTF-8 кодовая точка может быть представлена ​​с использованием 32, 16, 24 или 8 бит, а в системе UTF-16 она также является системой кодирования переменной длины.

Наконец, мы можем представить «А» так же, как мы представляем его, используя систему кодирования ASCII:

01001101

Небольшой пример, где UTF-16 на самом деле лучше, чем UTF-8:

Рассмотрим китайскую букву «語» — ее кодировка UTF-8:

11101000 10101010 10011110

Хотя его кодировка UTF-16 короче:

10001010 10011110

Чтобы понять представление и то, как оно интерпретируется, посетите исходный пост.

UTF-8

  • не имеет понятия порядка байтов
  • использует от 1 до 4 байтов на символ
  • ASCII — это совместимое подмножество кодировки.
  • полностью самосинхронизирующийся, например.выброшенный байт из любого места потока повредит не более одного символа
  • почти все европейские языки кодируются двумя байтами или меньше на символ

UTF-16

  • необходимо анализировать с известным порядком байтов или читать метку порядка байтов (BOM)
  • использует 2 или 4 байта на символ

UTF-32

  • каждый символ занимает 4 байта
  • необходимо анализировать с известным порядком байтов или читать метку порядка байтов (BOM)

UTF-8 будет наиболее эффективным использованием пространства, если только большинство символов не относятся к пространству символов CJK (китайский, японский и корейский).

UTF-32 лучше всего подходит для произвольного доступа по смещению символов в байтовом массиве.

Я провел несколько тестов для сравнения производительности базы данных между UTF-8 и UTF-16 в MySQL.

Обновить скорости

UTF-8

Enter image description here

UTF-16

Enter image description here

Вставить скорости

Enter image description here

Enter image description here

Удалить скорости

Enter image description here

Enter image description here

В UTF-32 все символы кодируются 32 битами.Преимущество в том, что вы можете легко вычислить длину строки.Недостаток заключается в том, что на каждый символ ASCII вы тратите лишние три байта.

В UTF-8 символы имеют переменную длину, символы ASCII кодируются одним байтом (восемь бит), большинство западных специальных символов кодируются либо двумя, либо тремя байтами (например, € — это три байта), а более экзотические символы могут занимать до четырех байт.Явным недостатком является то, что априори вы не можете вычислить длину строки.Но для кодирования текста латинского (английского) алфавита требуется намного меньше байтов по сравнению с UTF-32.

UTF-16 также имеет переменную длину.Символы кодируются либо двумя байтами, либо четырьмя байтами.Я действительно не вижу в этом смысла.Его недостаток состоит в том, что он имеет переменную длину, но не имеет такого преимущества, как экономия места, как UTF-8.

Из этих трех, очевидно, наиболее распространенным является UTF-8.

В зависимости от вашей среды разработки у вас может даже не быть выбора, какую кодировку будет использовать ваш строковый тип данных.

Но для хранения и обмена данными я бы всегда использовал UTF-8, если у вас есть выбор.Если у вас есть в основном данные ASCII, это даст вам наименьший объем данных для передачи, но при этом вы сможете все закодировать.Оптимизация для минимального количества операций ввода-вывода — это путь к современным машинам.

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

Однако шрифты, кодировка и прочее ужасно сложно (излишне?), поэтому для более подробного заполнения необходима большая ссылка:

http://www.cs.tut.fi/~jkorpela/chars.html#ascii

Не ждите, что поймете все это, но если вы не хотите иметь проблемы позже, стоит узнать как можно больше и как можно раньше (или просто попросить кого-нибудь разобраться во всем за вас).

Павел.

Короче говоря, единственная причина использовать UTF-16 или UTF-32 — это поддержка неанглийских и древних алфавитов соответственно.

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

Распространенное заблуждение – номер с суффиксом НЕ является показателем его возможностей.Все они поддерживают полный Unicode, но UTF-8 может обрабатывать ASCII с одним байтом, поэтому он БОЛЕЕ эффективен/менее повреждаем для процессора и через Интернет.

Немного хорошего чтения: http://www.personal.psu.edu/ejp10/blogs/gotunicode/2007/10/what_utf_do_i_use.htmlи http://utf8everwhere.org

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