связь между \ x и кодовыми точками Unicode

1

В 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

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

Теги:
hex
unicode
escaping
utf-8

2 ответа

0

Да, во-первых, это "цепочка из трех двухзначных шестнадцатеричных значений, равных десятичным 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

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

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

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

Существует более подробная информация об этом здесь.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню