Unicode, Unicode Big Endian или UTF-8? В чем разница? Какой формат лучше?


19

Когда я пытаюсь сохранить текстовый файл с неанглийским текстом в Блокноте, у меня появляется возможность выбора между Unicode , Unicode Big Endian и UTF-8 . В чем разница между этими форматами?

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

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

Примечание. Из ответов и комментариев ниже видно, что в языке Блокнот Unicode - это UTF-16 (Little Endian), Unicode - это Big UTF-16 (Big Endian), а UTF-8 - это UTF-8.


Ответы:


19

Не знаю. Что лучше: пила или молоток? :-)

Юникод не UTF

В этой статье есть немного больше, что касается темы:

  • UTF-8 фокусируется на минимизации размера байта для представления символов из набора ASCII (представление переменной длины: каждый символ представлен от 1 до 4 байтов, а все символы ASCII помещаются на 1 байт). Как говорит Джоэл:

«Посмотрите на все эти нули!» - сказали они, поскольку были американцами и смотрели текст на английском языке, в котором редко использовались кодовые точки выше U + 00FF. Также они были либеральными хиппи в Калифорнии, которые хотели сохранить (насмешливо). Если бы они были техасцами, они бы не стали вдыхать вдвое больше байтов. Но эти калифорнийские слабаков не могли вынести идею удвоить объем памяти, который он взял для струн

  • UTF-32 фокусируется на исчерпывающем представлении и представлении фиксированной длины, используя 4 байта для всех символов. Это самый простой перевод, отображающий непосредственно кодовую точку Unicode в 4 байта. Очевидно, это не очень эффективно по размеру.

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

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


4
Проблема заключается в том факте, что Unicode является «кодировкой», но не в смысле числа в байтах. UTF-8/16/32 - это все кодировки Unicode, но сам Unicode представляет собой отображение символов на числа. Я думаю, они могли бы использовать более уникальную терминологию, чтобы избежать этой путаницы.
Jerryjvl

4
Независимо от того, что касается OP вопроса, есть вероятность, что приложение означает «UTF-16», где написано «Unicode».
Jerryjvl

3
Я не уверен, что целью UTF-8 является «сохранение», а не обратная совместимость с ASCII.
Мистер Блестящий и Новый 宇 宇

@Johannes: Консорциум Unicode решил никогда не назначать кодовые точки выше U + 10FFFF, потому что они не могут быть представлены в UTF-16. Это привело к ограничению UTF-8 до 4 байтов.
user46971

1
«Юникод не UTF» - для многих это WTF;)
mlvljr

4

Для европейских языков UTF-8 меньше. Для восточных языков разница не столь очевидна.

Оба будут обрабатывать все возможные символы Unicode, поэтому не должно иметь значения в совместимости.


3

Существует больше кодировок Unicode, чем вы думаете.

  • UTF 8

    Кодировка UTF-8 имеет переменную ширину в диапазоне от 1 до 4 байтов, причем верхние биты каждого байта зарезервированы в качестве управляющих битов. Начальные биты первого байта указывают общее количество байтов, используемых для этого символа. Скалярное значение кодовой точки символа представляет собой конкатенацию неуправляемых битов. В этой таблице xпредставляет младшие 8 битов значения Unicode, yпредставляет следующие старшие 8 битов и zпредставляет биты выше этого.

    Unicode              Byte1     Byte2     Byte3     Byte4
    U+0000-U+007F       0xxxxxxx            
    U+0080-U+07FF       110yyyxx  10xxxxxx          
    U+0800-U+FFFF       1110yyyy  10yyyyxx  10xxxxxx    
    U+10000-U+10FFFF    11110zzz  10zzyyyy  10yyyyxx  10xxxxxx
    
  • ПСК-16
  • UCS-16BE
  • UCS-16LE

  • UTF-16
  • UTF-16BE
  • UTF-16LE

  • UTF-32
  • UTF-32-BE

1
Существует больше кодировок Unicode, чем вы перечислили. Например, UTF-1 , UTF-7 , UTF-EBCDIC , GB-18030 , MIME , UTF-9 и UTF-18 ... Вы также можете использовать любую схему двоичного кодирования для кодирования данных Unicode. Узнать больше Сравнение кодировок Unicode
phuclv

1

«Юникод» - это еще один термин для «UTF-16», который представляет собой кодировку набора символов Юникода в шестнадцати битах на символ. UTF-8 кодирует его в восемь битов на символ.

В обоих случаях любое переполнение выделяется другим 16 или восьми битам.


Какой из них лучше?
Р. Мартиньо Фернандес

"это зависит от ситуации.
Джон Сондерс

Хотя для этого конкретного вопроса кажется, что «Unicode» действительно используется в качестве другого термина для «UTF-16», это не так в общем - см. Ответ Джейсона.
Арджан

1
Вы имеете в виду «за единицу кода», а не «за символ»; и UTF-8, и UTF-16 могут использовать несколько единиц кода для представления символа. И «Unicode» и «UTF-16» - это НЕ одно и то же, за исключением терминологии Microsoft.
user46971

1

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


Имейте в виду, что есть также разница в пропускной способности сети и использовании памяти.
Джейсон Бейкер

1
«UTF-8 обычно создает файлы меньшего размера»: обычно нет. UTF-8 производит файлы меньшего размера для файлов ASCII. Если файл состоит только из кодовых точек Unicode выше U + 0800, он будет больше в UTF-8, чем в UTF-16.
Слеське

0

Одним словом, Unicode - это набор символов , в то время как Unicode Big Endian и utf-8 - это две кодировки , которые используются для хранения символов как 01 на компьютере.


И разница в том ...?
Дэвид Ричерби
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.