Я слышал противоречивые мнения людей - согласно странице Википедии UTF-8 .
Это одно и то же, не так ли? Может кто-нибудь уточнить?
Я слышал противоречивые мнения людей - согласно странице Википедии UTF-8 .
Это одно и то же, не так ли? Может кто-нибудь уточнить?
Ответы:
Чтобы расширить ответы, которые дали другие:
У нас много языков с большим количеством символов, которые в идеале должны отображать компьютеры. Юникод присваивает каждому символу уникальный номер или кодовую точку.
Компьютеры имеют дело с такими числами, как байты ... пропуская здесь немного истории и игнорируя проблемы адресации памяти, 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.
Надеюсь, что заполняет некоторые детали.
0x04000000
до 0x7FFFFFFF
или в двоичном виде 1111110v 10vvvvvv 10vvvvvv 10vvvvvv 10vvvvvv 10vvvvvv
- и это действительно 6 байтов. Тем не менее, 6 байтов - это максимум , а не так, как в статье смущает утверждение «шесть байтов или больше ».
Позвольте мне использовать пример, чтобы проиллюстрировать эту тему:
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, нажмите здесь
0
то символ представлен 1 байтом (текущим), если байт начинается с, 110
то символ представлен 2 байтами (текущим и следующим ( оставшиеся биты после 10
)), если байт начинается с, 1110
то символ представлен 3 байтами, текущим и следующими 2 байтами (оставшиеся биты после 10
).
«Юникод», к сожалению, используется по-разному, в зависимости от контекста. Его наиболее правильное использование (IMO) - это набор кодированных символов - то есть набор символов и отображение между символами и целочисленными кодовыми точками, представляющими их.
UTF-8 - это кодировка символов - способ преобразования последовательностей байтов в последовательности символов и наоборот. Он охватывает весь набор символов Unicode. ASCII кодируется как один байт на символ, а другие символы занимают больше байтов в зависимости от их точной кодовой точки (до 4 байтов для всех определенных на данный момент кодовых точек, т. Е. До U-0010FFFF, и, действительно, 4 байта могут обрабатывать до U-001FFFFF).
Когда в качестве имени кодировки символов используется «Юникод» (например, в качестве свойства .NET Encoding.Unicode ), это обычно означает UTF-16 , который кодирует наиболее распространенные символы в виде двух байтов. Некоторые платформы (особенно .NET и Java) используют UTF-16 в качестве «родной» кодировки символов. Это приводит к серьезным проблемам, если вам нужно беспокоиться о символах, которые не могут быть закодированы в одном значении UTF-16 (они закодированы как «суррогатные пары») - но большинство разработчиков никогда не беспокоятся об этом, IME.
Некоторые ссылки на Unicode:
Это не одно и то же - UTF-8 - это особый способ кодирования Unicode.
Существует множество различных кодировок, которые вы можете выбрать в зависимости от вашего приложения и данных, которые вы собираетесь использовать. Насколько я знаю, наиболее распространенными являются UTF-8, UTF-16 и UTF-32.
Юникод определяет только кодовые точки , то есть число, которое представляет символ. То, как вы храните эти кодовые точки в памяти, зависит от используемой кодировки . UTF-8 является одним из способов кодирования символов Unicode, среди многих других.
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 (корзина)
http://www.wikiwand.com/en/UTF-8#/Description
Посмотрите на первый ряд.
Unicode - это просто стандарт, который определяет набор символов ( UCS ) и кодировки ( UTF ) для кодирования этого набора символов. Но в целом Unicode относится к набору символов, а не к стандарту.
Прочитайте Абсолютный минимум Каждый разработчик программного обеспечения Абсолютно, положительно должен знать о Юникоде и наборах символов (никаких оправданий!) И Юникоде за 5 минут .
Существующие ответы уже объясняют много деталей, но вот очень короткий ответ с самым прямым объяснением и примером.
Юникод - это стандарт, который отображает символы в кодовые точки.
Каждый символ имеет уникальный код (идентификационный номер), который представляет собой число, подобное 9731.
UTF-8 представляет собой кодирование из кодовых значений.
Чтобы сохранить все символы на диске (в файле), UTF-8 разбивает символы на до 4 октетов (8-битных последовательностей) - байтов. UTF-8 является одной из нескольких кодировок (методов представления данных). Например, в Unicode (десятичная) кодовая точка 9731 представляет собой snowman ( ☃
), который состоит из 3 байтов в UTF-8:E2 98 83
Вот отсортированный список с некоторыми случайными примерами .
В мире много символов, таких как «$, &, h, a, t,?, 张, 1, =, + ...».
Затем появляется организация, которая посвящена этим персонажам,
Они сделали стандарт под названием «Юникод».
Стандарт выглядит следующим образом:
PS: Конечно, есть другая организация, называемая ISO, поддерживающая другой стандарт - «ISO 10646» - почти такой же.
Как и выше, 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 способ мышления вещей, или ничего не будет иметь смысла.
До сих пор мы предполагали, что буква соответствует некоторым битам, которые вы можете сохранить на диске или в памяти:
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? ...»
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 можно определить, является ли байт в этой позиции первым байтом символа или нет, и найти начало следующего или текущего символа без необходимости сканирования вперед. или назад больше, чем на несколько байтов, или прочитайте что-нибудь в начале потока.
Это одно и то же, не так ли?
Нет, это не так.
Я думаю, что первое предложение страницы Википедии, на которую вы ссылались, дает хорошее, краткое резюме:
UTF-8 - это кодировка символов переменной ширины, способная кодировать все 1112 064 действительных кодовых точек в Unicode, используя от одного до четырех 8-битных байтов.
Разработать:
Юникод - это стандарт, который определяет карту от символов до цифр, так называемых кодовых точек (как в примере ниже). Для полного отображения вы можете посмотреть здесь .
! -> U+0021 (21),
" -> U+0022 (22),
\# -> U+0023 (23)
UTF-8 - это один из способов кодирования этих кодовых точек в форме, понятной компьютеру, то есть битам . Другими словами, это способ / алгоритм для преобразования каждой из этих кодовых точек в последовательность битов или преобразования последовательности битов в эквивалентные кодовые точки. Обратите внимание, что существует множество альтернативных кодировок для Unicode.
Джоэл дает действительно хорошее объяснение и обзор истории здесь .
Если я могу обобщить то, что я собрал из этой темы:
Юникод «переводит» символы в порядковые номера (в десятичной форме) .
à = 224
UTF-8 - это кодировка, которая «переводит» эти числа в двоичные представления .
224 = 11000011 10100000
Обратите внимание, что мы говорим о двоичном представлении 224, а не о его двоичной форме, которая равна 0b11100000.
Эта статья объясняет все детали 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.