Какое правило для кодировки UTF-8? - PullRequest
0 голосов
/ 15 февраля 2019

Я читаю Кодировка UTF-8 , и я не понимаю это предложение:

Для символов, равных или ниже 2047 (шестнадцатеричный 0x07FF), UTF-8 представление распространяется на два байта.В первом байте будут установлены два старших бита, а третий бит сброшен (т. Е. От 0xC2 до 0xDF).У второго байта будет установлен верхний бит, а второй бит очищен (т. Е. От 0x80 до 0xBF).

2047 (0x07FF) действительно представлен двумя байтами, и его максимальное значение равно 0000 0111 1111 1111.

Я не вижу связи между первым байтом и двумя установленными старшими битами и чистым третьим битом .

Что означает это предложениезначит?

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

Как вы уже знаете, 2047 (0x07FF) содержит необработанные биты

00000111 11111111

Если вы посмотрите на диаграмму распределения битов для UTF-8 :

image

Вы увидите, что 0x07FF попадает во вторую строку, поэтому он кодируется как 2 байта с использованием этой битовой комбинации:

110xxxxx 10xxxxxx

Замените необработанныйбиты в x с, и вы получите такой результат:

11011111 10111111 (0xDF 0xBF)

В точности то, что сказано в цитируемом вами описании:

Первый байт будет иметь два старших битаустановить и сбросить третий бит ( 110 11111).У второго байта будет установлен верхний бит, а второй бит очищен ( 10 111111).

0 голосов
/ 15 февраля 2019

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

Таким образом, для рассматриваемого диапазона кодировка "шаблон" имеет вид

110 abcde  10 fghijk

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

Таким образом, для кодовой точки U + 07EB вы получите

0x07   00000111
0xEB   11101011

, где верхние пять нольбиты замаскированы (помните, мы получаем только 11 - потому что максимальное значение, которое кодировка может вместить в два байта, равно 0x07FF. Если у вас большее значение, кодировка будет использовать другой шаблон, который составляет три байта), и так

0x07 = _____ 111  (template: _____ abc)
0xEB = 11 101011  (template: de fghijk)

abc de = 111 11 (where the first three come from 0x07, and the next two from 0xEB)
fghijk = 101011 (the remaining bits from 0xEB)

с получением значения

110 11111  10 101011

aka 0xDF 0xAB.

Статья Википедии о UTF-8 содержит больше примеров с красиво раскрашенными числамик сэ-э, что откуда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...