Почему нет Unicode, начинающегося с 0xC1? - PullRequest
0 голосов
/ 05 января 2020

При изучении кодировки Unicode и utf-8,

я заметил, что 129-й Unicode, кодируемый utf-8, начинается с 0xc2.

Я проверил последнюю букву 0xcf.

Нет Unicode был 0xc1 закодирован как 0xc1.

Почему 129-й Unicode начинается с 0xc2 вместо 0xc1?

Ответы [ 2 ]

3 голосов
/ 06 января 2020

В спецификации UTF-8 RF C 3629 конкретно указано в введении :

Значения октетов C0, C1, F5 до FF никогда не появляется.

Причина этого заключается в том, что 1-байтовая последовательность UTF-8 состоит из 8-битного двоичного шаблона 0xxxxxxx (ноль, за которым следуют семь битов) и может представлять Unicode кодовые точки, которые помещаются в семь битов (от U + 0000 до U + 007F).

2-байтовая последовательность UTF-8 состоит из 16-битового двоичного шаблона 110xxxxx 10xxxxxx и может представлять кодовые точки Unicode, которые соответствуют от восьми до одиннадцати битов (от U + 0080 до U + 07FF).

Недопустимо в кодировании UTF-8 использовать больше байтов, чем требуется минимум, поэтому U + 007F можно представить в двух байтах. как <b>110</b>00001 <b>10</b>111111 (C1 BF hex), он более компактен и поэтому следует спецификации в виде 1-байта <b>0</b>1111111.

Первое действительное двухбайтовое значение - это кодировка U + 0080, которая является <b>110</b>0010 <b>10</b>000000 (C2 80 hex), поэтому C0 и C1 никогда не появятся.

См. Раздел 3 UTF-8 определен Нация в стандарте. Последний абзац гласит:

Реализации вышеописанного алгоритма декодирования ДОЛЖНЫ защищать от декодирования недопустимых последовательностей. Например, наивная реализация может декодировать слишком длинную последовательность UTF-8 C0 80 в символ U + 0000 ....

3 голосов
/ 05 января 2020

UTF-8, начинающийся с 0xc1, будет кодовой точкой Unicode в диапазоне от 0x40 до 0x7f. 0xc0 будет кодовой точкой Unicode в диапазоне от 0x00 до 0x3f.

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

По той же причине вы обнаружите, что нет 4-байтовых кодов, начинающихся с 0xf0 0x80 до 0xf0 0x8f, поскольку они хранятся с использованием меньшего числа байтов.

...