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

505

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

Это одно и то же, не так ли? Может кто-нибудь уточнить?

sarsnake
источник
1
То, что этот WIKI пишет о Unicode и UTFs, на мой взгляд, нормально. Некоторые комментарии к нему странны: «В UTF-8 (или любой другой многобайтовой кодировке) возможно разбить или обрезать строку в середине символа, что может привести к неверной строке». Таким образом, строка, которая получает кодировку UTF-8, является не строкой, а байтовым массивом или потоком байтов. Символы, составляющие строку, кодируются. Конечно, это может быть также расшифровано. Теперь, конечно, вы можете вырезать последовательность utf-8 после начального байта или после следующего байта, но зачем кому-то это делать?
Яркий
Эта статья о строковых типах данных является обучающей: mortoray.com/2013/11/27/the-string-type-is-broken - иногда при работе со строками и их компонентами уровня байтов вы можете случайно порезать символ пополам ,
Эверетт

Ответы:

497

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

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

Компьютеры имеют дело с такими числами, как байты ... пропуская здесь немного истории и игнорируя проблемы адресации памяти, 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, поскольку их диапазон значений по-прежнему ограничен, даже если этот предел значительно выше.

Другой тип кодирования использует переменное число байтов на символ, и наиболее распространенными кодировками для этого являются кодировки 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, в то время как большинство UNIX-систем по умолчанию используют UTF-8 в наши дни. Протоколы связи, такие как HTTP, как правило, лучше всего работают с UTF-8, поскольку размер блока в UTF-8 такой же, как в ASCII, и большинство таких протоколов были разработаны в эпоху ASCII. С другой стороны, UTF-16 дает наилучшую среднюю производительность пространства / обработки при представлении всех живых языков.

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

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

Скотт Теслер
источник
9
Концептуально, UCS-2 и UCS-4 - это наборы символов , а не кодировки символов (отсюда и название).
Механическая улитка
74
@Tuukka Ошибки в этой публикации легион. Существует более 2-х версий ISO 8859. ASCII не работает для английского языка, пропуская такие вещи, как фигурные кавычки, знаки цента, акценты и многое другое - Unicode - это не просто не английский; Английскому это тоже нужно !! Никакие кодовые точки не занимают более 4 байтов в ЛЮБОЙ кодировке; этот 6-байтовый бизнес совершенно неправильный. Вы не можете UTF-кодировать любое скалярное значение Unicode, так как это говорит: суррогаты и 66 других нехарактеров запрещены. UCS-4 и UTF-32 - это не одно и то же. Там нет мульти-блок UTF-32. UTF-16 не так эффективен, как они притворяются - & c & c & c!
tchrist
1
ASCII также не содержит знак фунта £ и, конечно, не содержит знак евро € (который значительно моложе, чем ASCII).
TRiG
1
@tchrist Похоже, 6 байтов не являются невероятными. Смотрите это: joelonsoftware.com/articles/Unicode.html, который обозначает, что есть символьное пространство от 0x04000000до 0x7FFFFFFFили в двоичном виде 1111110v 10vvvvvv 10vvvvvv 10vvvvvv 10vvvvvv 10vvvvvv - и это действительно 6 байтов. Тем не менее, 6 байтов - это максимум , а не так, как в статье смущает утверждение «шесть байтов или больше ».
синтаксическая ошибка
12
@syntaxerror: «Только кодовые точки 128 и выше хранятся с использованием 2, 3, фактически до 6 байтов». был точным при написании, но позже в том же году (двенадцать лет назад) он был признан недействительным. ru.wikipedia.org/wiki/UTF-8 говорит: «Исходная спецификация охватывала числа длиной до 31 бита (исходный предел универсального набора символов). В ноябре 2003 года RFC 3629 ограничил UTF-8 до конца на U + 10FFFF, чтобы соответствовать ограничениям кодировки символов UTF-16. При этом были удалены все 5- и 6-байтовые последовательности и около половины 4-байтовых последовательностей. "
Mooing Duck
237

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

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

PS Если вы хотите изучить эту тему в Python, нажмите здесь

Cheng
источник
6
«Но подождите минуту, это« 01101100 01001001 »один символ или два символа? Вы знали, что это один символ, потому что я сказал вам, но когда компьютер читает его, он понятия не имеет. Поэтому нам нужно какое-то« кодирование »для скажи компьютеру, чтобы он относился к нему как к одному ». Ну хорошо, но компьютер все еще не знает, должен ли он кодировать его с помощью utf-8?
Корай Тугай
15
@KorayTugay Компьютер не знает, какую кодировку он должен использовать. Вы должны указать это при сохранении символа в файл, а также при чтении символа из файла.
Ченг
3
@Connor Компьютер не знает, какой формат использовать. При сохранении документа текстовый редактор должен явно установить его кодировку utf-8 или любой другой формат, который хочет использовать пользователь. Кроме того, когда программа текстового редактора читает файл, она должна выбрать схему кодирования текста, чтобы правильно его декодировать. То же самое происходит, когда вы печатаете и вводите букву, текстовый редактор должен знать, какую схему вы используете, чтобы сохранить ее правильно.
Ченг
2
Так как же эти заголовки интерпретируются? если я смотрю на первую таблицу, то думаю: если байт начинается с бита, 0то символ представлен 1 байтом (текущим), если байт начинается с, 110то символ представлен 2 байтами (текущим и следующим ( оставшиеся биты после 10)), если байт начинается с, 1110то символ представлен 3 байтами, текущим и следующими 2 байтами (оставшиеся биты после 10).
JBoy
2
Прочитайте 10 статей о UTF-8; Прочитав это, я понял в течение 10 секунд :)
jrhee17
201

«Юникод», к сожалению, используется по-разному, в зависимости от контекста. Его наиболее правильное использование (IMO) - это набор кодированных символов - то есть набор символов и отображение между символами и целочисленными кодовыми точками, представляющими их.

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

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

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

Джон Скит
источник
16
Я думаю, что UTF-16 равняется «Unicode» только на платформах Windows. Люди обычно используют UTF-8 по умолчанию в * nix. +1, хотя, хороший ответ
Jalf
10
@ Крис: Нет, ISO-8859-1 не является UTF-8. UTF-8 кодирует U + 0080 до U + 00FF как два байта, а не один. Windows 1252 и ISO-8859-1 в основном одинаковы, но они отличаются между значениями 0x80 и 0x99, если я правильно помню, где ISO 8859-1 имеет «дыру», но CP1252 определяет символы.
Джон Скит
13
Идея назвать UTF-16 «Unicode» вызывает у меня беспокойство из-за его потенциальной путаницы, хотя это было четко указано только в качестве соглашения .NET. UTF-16 - это способ представления Unicode, но это не «кодировка Unicode».
Томасруттер
6
@unwesen: UTF-8 не нужны суррогатные пары. Он просто представляет символы не-BMP, используя последовательно более длинные последовательности байтов.
Джон Скит
5
@RoyiNamir: Да, к сожалению, Unicode часто используется для обозначения UTF-16, особенно в Windows.
Джон Скит
108

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

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

Greg
источник
10
однако дело в том, что некоторые редакторы предлагают сохранить файл как «Unicode» ИЛИ «UTF-8». Поэтому упоминание о том, что в данном случае «Unicode» - это UTF-16, я считаю необходимым.
Серхио
71

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

Мартин Кот
источник
2
однако дело в том, что некоторые редакторы предлагают сохранить файл как «Unicode» ИЛИ «UTF-8». Поэтому упоминание о том, что в данном случае «Unicode» - это UTF-16, я считаю необходимым.
Серхио
Число, которое представляет символ, также делает ASCII.
Яркий
6
Прочитайте это до и после просмотра остальных ответов на этой странице
Доджи
33

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

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

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

Например,

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

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

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

nightlytrails
источник
Нет, UTF-8 отображает только кодовые точки в последовательность, которая больше 127. Все от 0 до 127 - это не последовательность, а один байт. Кстати, ASCII также назначает имя персонажа для числа, так что это то же самое, что делает Unicode. Но Unicode не останавливается на кодовой точке 127, а достигает 0x10ffff.
Яркий
2
@ Я отличаюсь. Символы Ascii действительно отображаются в одну последовательность байтов. Первый бит, который равен 0 в случае кода для символов ascii, указывает, сколько байтов следует - ноль. http://www.wikiwand.com/en/UTF-8#/DescriptionПосмотрите на первый ряд.
nightlytrails
Ну, для меня последовательность состоит из более чем одного байта. Символ ASCII в UTF-8 представляет собой один байт как таковой, с самым старшим битом, установленным в 0. Для кодовых точек, превышающих 127, необходимы последовательности, которые всегда имеют начальный байт и один, два или три следующих байта. Так почему бы вам назвать один байт «последовательностью»?
Яркий
Ну ... Много раз английские юристы могут быть озадачены его преднамеренным неправильным использованием программного обеспечения. Здесь тот же случай. Вы можете поспорить по этому поводу. Но это не прояснит ситуацию.
nightlytrails
1
@brighty Хммм, в математике последовательность из 0 элементов это нормально. Последовательность из 1 элемента здесь тоже подойдет.
chux - Восстановить Монику
24

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

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

гумбо
источник
1
@serhio: я знаю. Хотя существует три разных кодировки UTF-16: два явных UTF-16LE и UTF-16BE и неявный UTF-16, в котором порядковый номер указывается с помощью спецификации.
Гамбо
@Gumbo: отсутствие спецификации не означает, что это другая кодировка. Там только две кодировки.
Mooing Duck
Блог выше написан генеральным директором Stakcoverflow.
Шайлеш Пратапвар
23

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

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

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

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

basic6
источник
1
Нет! UTF-8 - хороший способ кодировать символы Юникода, но мы можем кодировать также в UTF-16 или UTF-32. С UTF-32 мы имеем отношение 1: 1 между DWORD и кодовой точкой, с UTF-16 мы имеем отношение 1: 1 между WORD и кодовой точкой только для кодовых точек BMP, исключая суррогаты и спецификации. В UTF-8 у нас есть соотношение 1: 1 между байтом и
кодовой точкой
5
@brighty: Да, но почему "Нет!" Я написал «UTF-8 - одна из нескольких кодировок», потому что есть также UTF-16 и UTF-32.
basic6
16

1. Юникод

В мире много символов, таких как «$, &, h, a, t,?, 张, 1, =, + ...».

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

Они сделали стандарт под названием «Юникод».

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

  • создать форму, в которой каждая позиция называется «кодовая точка» или «кодовая позиция».
  • Все позиции от 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 - это значение, которое мы сохраняем в компьютере для «$».

wengeezhang
источник
1
В общем, UTF-8 - единственный вариант, который сегодня используют все.
Рик Джеймс
2
ISO 10646 является идентичным стандартом для набора символов Unicode. Unicode определяет множество вещей, отличных от набора символов, таких как правила сортировки, наблюдения и т. Д. ISO 10646 - это просто набор символов (которых в настоящее время насчитывается более 130 000). Консорциум Unicode и ISO разрабатывают Unicode совместно, при этом ISO касается только набора символов и его кодировок, а Unicode также определяет свойства символов и правила для обработки текста.
Томасруттер
12

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

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

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

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

A -> 0100 0001

В Unicode буква отображается на то, что называется кодовой точкой, которая все еще является теоретической концепцией. То, как эта кодовая точка представлена ​​в памяти или на диске, - это совсем другая история ... »

«... Каждой платонической букве в каждом алфавите консорциум Unicode присваивает магическое число, которое записывается так: U + 0639. Это магическое число называется кодовой точкой. U + означает« Unicode », а числа шестнадцатеричные. U + 0639 - арабская буква Ain. Английская буква A будет U + 0041 .... "

"... Хорошо, так сказать, у нас есть строка:

Привет

который в Unicode соответствует этим пяти кодам:

U + 0048 U + 0065 U + 006C U + 006C U + 006F.

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

"... Вот где приходят кодировки.

Самая ранняя идея для кодировки Unicode, которая привела к мифу о двух байтах, была, эй, давайте просто сохраним эти числа в два байта каждый. Так Здравствуйте становится

00 48 00 65 00 6C 00 6C 00 6F

Правильно? Не так быстро! Не может ли это быть:

48 00 65 00 6C 00 6C 00 6F 00? ...»

kommradHomer
источник
В ASCII буква также отображается в кодовой точке, а не только в Unicode.
Яркий
8

UTF-8 - это одна из возможных схем кодирования текста Unicode .

Unicode - это стандарт широкого диапазона, который определяет более 130 000 символов и присваивает каждому числовой код (кодовую точку). Он также определяет правила сортировки этого текста, его нормализации, изменения регистра и т. Д. Символ в Unicode представлен кодовой точкой от нуля до 0x10FFFF включительно, хотя некоторые кодовые точки зарезервированы и не могут использоваться для символов.

Существует несколько способов кодирования строки кодовых точек Unicode в двоичный поток. Это называется "кодировки". Наиболее простым кодированием является UTF-32 , который просто хранит каждую кодовую точку в виде 32-разрядного целого числа, каждый из которых имеет ширину 4 байта.

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

UTF-8 был разработан с учетом следующих свойств:

  • Символы ASCII кодируются точно так же, как в ASCII, так что строка ASCII также является допустимой строкой UTF-8.

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

  • Символы, требующие нескольких байтов, не содержат байтовых значений в диапазоне ASCII, поэтому их часть нельзя принять за символы ASCII. Это тоже функция безопасности.

  • UTF-8 может быть легко проверен и отличен от других кодировок с помощью валидатора. Текст в других 8-битных или многобайтовых кодировках очень редко будет также проверяться как UTF-8.

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

thomasrutter
источник
Несколько второстепенных моментов: [1] Разве «символы ASCII не должны кодироваться точно так, как они есть в ASCII », не должны быть изменены на «символы ASCII, которые кодируются точно так же, как и в UTF-8 » ? [2] Фраза «Коды в Unicode ...» неясна (для меня). Вы имеете в виду "кодовые точки Unicode ..." ?
скомиса
@skomisa для пункта 1, я имел в виду, что кодировка символов в диапазоне ASCII идентична для ASCII и для UTF-8.
Томасруттер
Что касается пункта 2, это справедливо, и я отредактирую это, чтобы сделать его более ясным
thomasrutter
2

Это одно и то же, не так ли?

Нет, это не так.


Я думаю, что первое предложение страницы Википедии, на которую вы ссылались, дает хорошее, краткое резюме:

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

Разработать:

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

    ! -> U+0021 (21),  
    " -> U+0022 (22),  
    \# -> U+0023 (23)
    
  • UTF-8 - это один из способов кодирования этих кодовых точек в форме, понятной компьютеру, то есть битам . Другими словами, это способ / алгоритм для преобразования каждой из этих кодовых точек в последовательность битов или преобразования последовательности битов в эквивалентные кодовые точки. Обратите внимание, что существует множество альтернативных кодировок для Unicode.


Джоэл дает действительно хорошее объяснение и обзор истории здесь .

Dimos
источник
2

Если я могу обобщить то, что я собрал из этой темы:

Юникод «переводит» символы в порядковые номера (в десятичной форме) .

à = 224

UTF-8 - это кодировка, которая «переводит» эти числа в двоичные представления .

224 = 11000011 10100000

Обратите внимание, что мы говорим о двоичном представлении 224, а не о его двоичной форме, которая равна 0b11100000.

remykarem
источник
2

Эта статья объясняет все детали http://kunststube.net/encoding/

ПИСЬМО В БУФЕР

если вы записываете в 4-байтовый буфер, символ с кодировкой UTF8, ваш двоичный файл будет выглядеть так:

00000000 11100011 10000001 10000010

если вы записываете в 4-байтовый буфер, символ с кодировкой UTF16, ваш двоичный файл будет выглядеть так:

00000000 00000000 00110000 01000010

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

Например, для этого конкретного символа: кодировка UTF16 более эффективна, поскольку у нас есть 2 свободных байта для следующего символа. Но это не значит, что вы должны использовать UTF16 для японского алфавита.

ЧТЕНИЕ ИЗ БУФЕРА

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

Например, если вы расшифруете это: 00000000 11100011 10000001 10000010 в кодировку UTF16, вы получите не

Примечание. Кодировка и Unicode - это две разные вещи. Unicode - это большой (таблица) с каждым символом, сопоставленным с уникальной кодовой точкой. Например, символ (буква) имеет (кодовую точку) : 30 42 (шестнадцатеричное). Кодирование, с другой стороны, представляет собой алгоритм, который преобразует символы более подходящим способом при хранении на аппаратном уровне.

30 42 (hex) - > UTF8 encoding - > E3 81 82 (hex), which is above result in binary.

30 42 (hex) - > UTF16 encoding - > 30 42 (hex), which is above result in binary.

введите описание изображения здесь

InGeek
источник
очень хорошая связанная статья, надеюсь, она продолжает оставаться активной
yolob 21
0

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

Unicode - это стандарт для представления разнообразных символов из разных языков.

akaMahesh
источник
4
«8-битные последовательности»…? Возможно, хотелось бы уточнить, что точнее ...
deceze