В чем разница между UTF-8 и Unicode

Я слышал противоречивые мнения от людей-согласно Википедии,посмотреть здесь.

Это одно и то же, не так ли? Может кто-нибудь прояснить?

10 ответов


чтобы расширить ответы, которые дали другие:

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

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

старые кодировки символов, такие как ASCII, относятся к (до) 8-битной эре и пытаются втиснуть доминирующий язык в вычислениях в то время, то есть английский, в числа от 0 до 127 (7 бит). С 26 буквами в алфавите, как в заглавной, так и в не-заглавной форме, цифрами и знаками препинания, которые работали довольно хорошо. ASCII был расширен на 8 бит для других, неанглийских языков, но дополнительные 128 номеров / кодовых точек, доступных это расширение будет отображаться на разные символы в зависимости от отображаемого языка. Стандарты ISO-8859 являются наиболее распространенными формами этого сопоставления; ISO-8859-1 и ISO-8859-15 (также известные как ISO-Latin-1, latin1, и да, есть две разные версии стандарта ISO 8859).

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

существует по существу два разных типа кодировок: один расширяет диапазон значений, добавляя больше битов. Примерами таких кодировок могут быть UCS2 (2 байта = 16 бит) и UCS4 (4 байта = 32 бита). Они страдают от по своей сути той же проблемы, что и ASCII и ISO-8859 standars, поскольку их диапазон значений по-прежнему ограничен, даже если предел значительно выше.

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

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

и стандарты UCS и UTF стандарты кодируют кодовые точки, определенные в Unicode. Теоретически эти кодировки могут использоваться для кодирования любого числа (в пределах диапазона, поддерживаемого кодировкой), но, конечно, эти кодировки были сделаны для кодирования кодовых точек Unicode. И это ваши отношения между ними.

Windows обрабатывает так называемые строки" Unicode " как строки UTF-16, в то время как большинство UNIXes по умолчанию UTF-8 в эти дни. Протоколы связи, такие как HTTP, лучше всего работают с UTF-8, так как размер блока в UTF-8 то же самое, что и в ASCII, и большинство таких протоколов были разработаны в эпоху ASCII. С другой стороны, UTF-16 дает лучшее в среднем космос/производительность при представлении всех живых языков.

стандарт Unicode определяет меньше кодовых точек, чем может быть представлено в 32 битах. Таким образом, для всех практических целей UTF-32 и UCS4 стали одной и той же кодировкой, поскольку вам вряд ли придется иметь дело с многоэлементными символами в UTF-32.

надеюсь, что заполняет отдельные детали.


"Unicode", к сожалению, используется по-разному, в зависимости от контекста. Его наиболее правильное использование (ИМО) - как кодированный набор символов - т. е. набор символов и отображение между символами и целым числом коды представляя их.

UTF-8 - это кодировка символов-способ преобразования из последовательностей байтов в последовательности символов и наоборот. Она охватывает весь набор символов Unicode. ФОРМАТ ASCII кодируется как один байт на символ, а другие символы занимают больше байтов в зависимости от их точной кодовой точки (до 4 байтов для всех определенных в настоящее время кодовых точек, т. е. до U-0010FFFF, и действительно 4 байта могут справиться с U-001FFFFF).

когда "Unicode" используется в качестве имени кодировки символов (например, как .NET кодировка.Unicode свойства), это обычно означает UTF-16, который кодирует наиболее распространенные символы как два байта. Некоторые платформы (в частности, .NET и Java) используют UTF-16 в качестве своей "родной" кодировки символов. Это приводит к волосатым проблемам, если вам нужно беспокоиться о символах, которые не могут быть закодированы в одном значении UTF-16 (они закодированы как "суррогатные пары"), но большинство разработчиков никогда не беспокоятся об этом, IME.

некоторые ссылки на Unicode:


позвольте мне использовать пример, чтобы проиллюстрировать эту тему:

A chinese character:      汉
it's unicode value:       U+6C49
convert 6C49 to binary:   01101100 01001001

ничто волшебное до сих пор, это очень просто. Теперь, предположим, мы решили сохранить этот персонаж на нашем жестком диске. Для этого нам нужно сохранить символ в двоичном формате. Мы можем просто хранить его как "01101100 01001001". Готово!

но подождите минутку, это '01101100 01001001' один символ или два символа? Вы знали, что это один символ, потому что я сказал вам, но когда компьютер читает его, у него нет идея. Поэтому нам нужна какая-то" кодировка", чтобы сказать компьютеру, чтобы он относился к нему как к одному.

здесь вступают в действие правила "UTF-8":http://www.fileformat.info/info/unicode/utf8.htm

Binary format of bytes in sequence

1st Byte    2nd Byte    3rd Byte    4th Byte    Number of Free Bits   Maximum Expressible Unicode Value
0xxxxxxx                                                7             007F hex (127)
110xxxxx    10xxxxxx                                (5+6)=11          07FF hex (2047)
1110xxxx    10xxxxxx    10xxxxxx                  (4+6+6)=16          FFFF hex (65535)
11110xxx    10xxxxxx    10xxxxxx    10xxxxxx    (3+6+6+6)=21          10FFFF hex (1,114,111)

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

Header  Place holder    Fill in our Binary   Result         
1110    xxxx            0110                 11100110
10      xxxxxx          110001               10110001
10      xxxxxx          001001               10001001

выписывание результата в одну строку:

11100110 10110001 10001001

это UTF-8 (двоичное) значение китайского символа! (подтвердите это сами:http://www.fileformat.info/info/unicode/char/6c49/index.htm)

резюме

A chinese character:      汉
it's unicode value:       U+6C49
convert 6C49 to binary:   01101100 01001001
embed 6C49 as UTF-8:      11100110 10110001 10001001

Это не одно и то же - UTF-8-это особый способ кодирования Unicode.

существует множество различных кодировок, которые вы можете выбрать в зависимости от вашего приложения и данных, которые вы собираетесь использовать. Наиболее распространенными являются UTF-8, UTF-16 и UTF-32 s, насколько я знаю.


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


Unicode является стандартом, который определяет, наряду с ISO / IEC 10646,универсальный набор символов (UCS), который является надмножеством всех существующих символов, необходимых для представления практически всех известных языках.

Unicode присваивает имя и номер (Код Символа или Кода) каждому персонажу в своем репертуаре.

кодировка UTF-8, это способ представить эти символы в цифровом виде в память компьютера. UTF-8 отображает каждую кодовую точку в последовательность октетов (8-битных байтов)

, например,

символ UCS = Символ Юникода Han

кодовая точка UCS = U+24B62

кодировка UTF-8 = F0 A4 AD A2 (hex) = 11110000 10100100 10101101 10100010 (bin)


Unicode - это просто стандарт, который определяет набор символов (UCS) и кодировках (UTF) для кодирования этого набора символов. Но в целом Unicode ссылается на набор символов, а не на стандарт.

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


существующие ответы уже объясняют много деталей, но вот очень короткий ответ с самым прямым объяснением и примером.

Unicode-это стандартный это сопоставляет символы с кодовыми точками.
Каждый символ имеет уникальную кодовую точку (идентификационный номер), которая представляет собой число, подобное 9731.

UTF-8 является the кодирование из кодов.
Для того, чтобы хранить все символы на диске (в файле) UTF-8 разбивает символы на 4 октета (8 - разрядные последовательности) - байты. UTF-8 является одной из нескольких кодировок (методов представления данных). Например, в Юникоде (десятичная) кодовая точка 9731 представляет снеговика (), который состоит из 3 байт в UTF-8:E2 98 83

здесь отсортированный список с некоторыми случайными примерами.


1. Unicode

есть много персонажей по всему миру, таких как"$,&, h,a,t,?,张,1,=,+...".

затем приходит организация, которая посвящена этим персонажам,

Они сделали стандарт под названием "Unicode".

стандарт выглядит следующим образом:

  • создайте форму,в которой каждая позиция называется "кодовая точка"или"кодовая позиция".
  • все позиции от U + 0000 до U+10FFFF;
  • вверх до сих пор некоторые позиции заполняются символами,а другие позиции сохраняются или пусты.
  • например, позиция " U+0024 "заполняется символом"$".

PS: конечно, есть еще одна организация под названием ISO, поддерживающая другой стандарт - "ISO 10646", почти то же самое.

2. UTF-8

Как указано выше, U + 0024-это просто позиция, поэтому мы не можем сохранить "U+0024" в компьютере для символа "$".

должно быть метод кодирования.

затем появляются методы кодирования,такие как UTF-8,UTF-16,UTF-32, UCS-2....

под UTF-8 кодовая точка "U+0024" кодируется в 00100100.

00100100 ценность мы экономим на компьютер "$".


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

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

на самом деле, Unicode имеет другое способ мышления о символах, и вы должны понять способ мышления Unicode о вещах или ничего не будет иметь смысла.

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