UTF-8 Продолжение байтов

Я пытаюсь выяснить, что такое "байты продолжения" (для любопытства) в кодировке UTF-8.

Википедия вводит этот термин в статью UTF-8, не определяя его вообще

Поиск Google также не возвращает никакой полезной информации. Я собираюсь перейти к официальной спецификации, но лучше сначала прочитать резюме высокого уровня.

3 ответа

Решение

Байт продолжения в UTF-8 - это любой байт, в котором два старших бита 10,

Они являются последующими байтами в многобайтовых последовательностях. Следующая таблица может помочь:

Unicode code points   Range    Encoding  Binary value
-------------------  --------  --------------------------
 U+000000-U+00007f   0xxxxxxx  0xxxxxxx

 U+000080-U+0007ff   110yyyxx  00000yyy xxxxxxxx
                     10xxxxxx

 U+000800-U+00ffff   1110yyyy  yyyyyyyy xxxxxxxx
                     10yyyyxx
                     10xxxxxx

 U+010000-U+10ffff   11110zzz  000zzzzz yyyyyyyy xxxxxxxx
                     10zzyyyy
                     10yyyyxx
                     10xxxxxx

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

Основные правила таковы:

  1. Если байт начинается с 0 бит, это значение одного байта меньше 128.
  2. Если это начинается с 11, это первый байт многобайтовой последовательности и число 1 биты в начале указывают на общее количество байтов (110xxxxx имеет два байта, 1110xxxx имеет три и 11110xxx имеет четыре).
  3. Если это начинается с 10Байт продолжения.

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

Точно так же это может также использоваться для UTF-8 strlen считая только10xxxxxx байт.

Короче говоря, байты продолжения являются байтами, за исключением первого байта или одного байта. В UTF-8 байты продолжения начинаются с 0x10.

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

Стандарт Unicode использует это выражение только в одном месте, Ch. 5, пункт 5.22: "Например, рассмотрим первые три байта четырехбайтовой последовательности UTF-8, за которыми следует байт, который не может быть действительным продолжающим байтом:". В этом контексте значение ясно: это просто байт, который продолжает что-то, а именно последовательность байтов.

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

Другие вопросы по тегам