связь между \ x и кодовыми точками Unicode - PullRequest
1 голос
/ 18 апреля 2019

В Python (2 или 3) оценка b'\xe2\x80\x8f'.decode("utf-8")

приводит к \u200f, и аналогично '\u200f'.encode("utf-8") дает b'\xe2\x80\x8f'.

Первое выглядит как цепочкатри двухзначных шестнадцатеричных значения, которые будут равны десятичному 226, 128 и 143. Второе выглядит как одно шестнадцатеричное значение, равное десятичному 8,207.

Существует ли логическая связь между '\ xe2 \ x80 \ x8f'и' \ u200f '?Я неправильно интерпретирую значения?

Я вижу, что значения как-то связаны в таблицах, подобных этой: https://www.utf8 -chartable.de / unicode-utf8-table.pl? Start = 8192 & number =128 & utf8 = string-literal

но почему эти два значения находятся в одной строке?

Ответы [ 2 ]

0 голосов
/ 18 апреля 2019

Да, во-первых, это «цепочка из трех двухсимвольных шестнадцатеричных значений, равных десятичным 226, 128 и 143.»Это строка байтов.Вы получили байтовую строку, потому что это то, что делает encode.Вы передали его в формате UTF-8, поэтому байты являются кодировкой UTF-8 для входной символьной строки.

«Второе выглядит как одно шестнадцатеричное значение, которое будет равно десятичному 8,207».Вроде, как бы, что-то вроде;Это нотация для кодовой единицы UTF-16 внутри строки буквенных символов.Один или два кодовых блока UTF-16 кодируют кодовую точку Unicode.В этом случае только один используется для соответствующей кодовой точки.

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

Для диапазона кодовой точки Unicode требуется 21 бит.UTF-16 кодирует кодовую точку в одну или две 16-битные кодовые единицы (так что это два байта в некотором порядке байтов для каждой кодовой единицы).UTF-8 кодирует кодовую точку в одну, две, три или четыре 8-битных кодовых единицы.(8-разрядное целое число составляет один байт, поэтому порядок следования байтов является спорным.) Каждое кодирование символов имеет отдельный алгоритм для распределения 21 бита на столько байтов, сколько необходимо.Оба являются обратимыми и полностью поддерживают набор символов Unicode.Таким образом, вы могли бы напрямую конвертировать одно в другое.

Таблица, на которую вы ссылаетесь, не показывает UTF-16.Он показывает шестнадцатеричное обозначение кодовой точки Unicode: U + 200F.Это обозначение для людей, чтобы идентифицировать кодовые точки.Случается, что когда UTF-16 кодирует кодовую точку в одной кодовой единице, ее номер совпадает с номером кодовой точки.

0 голосов
/ 18 апреля 2019

Разница связана с количеством битов / байтов, которое каждый символ принимает для представления в utf-8.

Для любого символа, равного или ниже 127 (hex 0x7F), UTF-8 представление составляет один байт. Это просто самые низкие 7 бит из полного значение Юникода. Это также соответствует значению ASCII.

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

Подробнее об этом здесь .

Если вам нужна дополнительная информация о том, как Python использует эти значения, посмотрите здесь .

...