В чем разница между 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:
- веб-сайт консорциума Unicode и в частности уроки раздел
- Иоиля статья
- моя собственная статья (ориентированный на .NET)
позвольте мне использовать пример, чтобы проиллюстрировать эту тему:
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 о вещах или ничего не будет иметь смысла.
до сих пор мы предполагали, что буква сопоставляется с некоторыми битами, которые вы можете хранить на