Что означает первый бит (т.е. двоичный 0) в стандарте кодирования UTF-8?

По профессии я PHP-разработчик.

Рассмотрим пример ниже:

Я хочу закодировать слово "привет", используя кодировку UTF-8.

So,

Эквивалентные кодовые точки каждой из букв слова "hello" приведены ниже:

h = 104
e = 101
l = 108
o = 111

Итак, мы можем сказать, что список десятичных чисел представляет собой строку "hello":

104 101 108 108 111

Кодировка UTF-8 будет хранить "hello" следующим образом (в двоичном виде):

01101000 01100101 01101100 01101100  01101111

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

Мой вопрос: почему этот начальный 0 был добавлен к каждому сохраняемому символу? Какова цель использования его в кодировке UTF-8?

Что было сделано, когда одна и та же строка была закодирована в формате UTF-16?

Если это необходимо, то может ли начальный дополнительный символ быть битовым значением 1?

Означает ли NUL Byte двоичный символ 0?


person Community    schedule 07.06.2018    source источник
comment
Показанные вами числа представляют собой десятичные представления кодовых точек. Фактические кодовые точки: h = U+0068 (hex 0x68 dec 104), e = U+0065 (hex 0x65 dec 101), l = U+006C (hex 0x6C dec 108), o = U+006F (hex 0x6F dec 111). Кодовые точки ‹= U+007F кодируются одинаково в UTF-8 и UTF-16, только с UTF-16, расширяющим 7-битные значения до 16 бит. Итак, hello кодируется следующим образом в UTF-16LE: 01101000 00000000 01100101 00000000 01101100 00000000 01101100 00000000 01101111 00000000 и в UTF-16BE: 00000000 01101000 00000000 01100101 00000000 01101100 00000000 01101100 00000000 01101111   -  person Remy Lebeau    schedule 08.06.2018


Ответы (2)


UTF-8 обратно совместим с ASCII. ASCII использует значения от 0 до 127 и присваивает им символы. Это означает байты с 0000 0000 по 0111 1111. UTF-8 сохраняет то же самое отображение для тех же первых 128 символов.

Любой символ, не найденный в ASCII, кодируется в форме 1xxx xxxx в UTF-8, т. е. для любого символа, отличного от ASCII, старший бит каждого закодированного байта равен 1. Эти символы кодируются несколькими байтами в UTF-8. Первые биты первого байта в последовательности сообщают декодеру, из скольких байтов состоит символ; 110x xxxx сигнализирует о том, что это 2-байтовый символ, 1110 xxxx — 3-байтовый символ и 1111 0xxx — 4-байтовый символ. Последующие байты в последовательности имеют форму 10xx xxxx. Итак, нет, вы не можете просто установить его на 1 произвольно.

Существуют различные расширения ASCII (например, ISO-8859), которые также устанавливают этот первый бит и тем самым добавляют еще 128 символов формы 1xxx xxxx.

Существует также 7-битный ASCII, в котором первый 0 бит отсутствует, а используются только 000 0000-111 1111.

Означает ли NUL Byte двоичный символ 0?

Это означает битовую последовательность 0000 0000, т. е. полностью нулевой байт с десятичным/шестнадцатеричным/восьмеричным значением 0.

Вас может заинтересовать Что абсолютно необходимо знать каждому программисту о кодировках и наборах символов для работы с текстом .

person deceze♦    schedule 07.06.2018
comment
Почему ASCII добавляет дополнительный бит к двоичному эквиваленту десятичной кодовой точки? - person ; 07.06.2018
comment
По типичному соглашению байты составляют 8 бит. Стандартный ASCII как раз соответствует этому ожиданию. Опять же, 7-битный ASCII явно пропускает лишний бит, но требует специальной обработки взамен в системах, которые по умолчанию ожидают 8 бит на байт. - person deceze♦; 07.06.2018
comment
Вы говорите, что согласно соглашению байт формируется из восьми битов, и системы ожидают взамен того же байта, состоящего из восьми битов? Это причина добавления дополнительного бита в начале. Я правильно понимаю? - person ; 07.06.2018
comment
Да это оно. - person deceze♦; 07.06.2018
comment
Дополнительные 0 предназначены для удобочитаемости. 01101000 01100101 01101100 01101100 01101111 также может быть записано как 1101000 1100101 1101100 1101100 1101111, но это не так приятно читать, поскольку байты обычно имеют размер 8 бит. В любом случае, старший бит по-прежнему равен 0 с точки зрения компьютера. У вас не может быть неназначенных битов, бит всегда равен 0 или 1. - person Remy Lebeau; 08.06.2018

UTF-8 кодирует кодовые точки Unicode от U+0000 до U+007F (которые представляют собой символы ASCII 0–127), используя 7 бит. Восьмой бит используется для обозначения того, что дополнительные байты необходимы только при кодировании кодовых точек Unicode от U+0080 до U+10FFFF.

Например, è — это кодовая точка U+00E8, которая кодируется в UTF-8 как байты 0xC3 0xA8 (11000011 10101000 в двоичном формате).

Википедия довольно хорошо объясняет, как кодируется UTF-8.

Означает ли байт NUL двоичный символ 0?

да.

person xanatos    schedule 07.06.2018
comment
@remy Легкое редактирование :-) Хорошо ... Теперь мой ответ, безусловно, красивее, но я не буду благодарить вас, потому что я думаю, что это не было действительно необходимо :-) - person xanatos; 08.06.2018
comment
дело было не только в том, чтобы это выглядело красиво. Грамматика важна, но не менее важна и правильная терминология. Юникод достаточно сложен для понимания без неправильных имен и представлений, которые делают его еще более запутанным. - person Remy Lebeau; 08.06.2018