Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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

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

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

Ответ 3

Позвольте мне использовать пример для иллюстрации этой темы:

A chinese character:      汉
it 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 unicode value:       U+6C49
convert 6C49 to binary:   01101100 01001001
embed 6C49 as UTF-8:      11100110 10110001 10001001

P.S. Если вы хотите изучить эту тему на python, нажмите здесь click here

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

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

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

Например,

Символ UCS = Персонаж Unicode Han

UCS code-point = U + 24B62

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

Ответ 7

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

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

Ответ 8

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

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

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

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

Ответ 9

1. Unicode

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

Ответ 10

Я проверил ссылки в ответе Gumbo, и я хотел вставить часть этих вещей здесь, чтобы существовать в Stack Overflow.

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

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

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

A → 0100 0001

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

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

"... ОК, скажем, у нас есть строка:

Hello

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

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

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

"... То, куда входят кодировки.

Самая ранняя идея кодировки Юникода, которая привела к мифу о двух байтах, была, эй, просто хранить эти числа по два байта каждый. Итак, Hello становится

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

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

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

Ответ 11

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

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

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

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

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

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

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

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

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

Ответ 12

Они то же самое, не так ли?

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


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

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

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

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

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


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

Ответ 13

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

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

à = 224

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

224 = 11000011 10100000

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

Ответ 14

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

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

Ответ 15

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

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

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

00000000 11100011 10000001 10000010

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

00000000 00000000 00110000 01000010

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

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

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

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

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

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

enter image description here