Запутался в кодировке hex против utf-8 - PullRequest
0 голосов
/ 12 апреля 2020

Давайте возьмем символ - ( unicode-table ).

Когда я запускаю ord('ñ'), я получаю обратно 241 - ie, это 241-й кодированный символ.
Когда я запускаю hex(ord('ñ')), я возвращаюсь 0xf1, что является шестнадцатеричным значением для 241.

Так почему, когда я запускаю 'ñ'.encode('utf-8'), я возвращаюсь b'\xc3\xb1' или 50097 в десятичном виде ? Разве мы не подтвердили, что ñ - это f1 (гекс) или 241 (де c)?

1 Ответ

1 голос
/ 12 апреля 2020

241 - это кодовая точка Unicode, которая соответствует глифу «LATIN SMALL LETTER N WITH TILDE». В Python символы хранятся внутри как их кодовые точки Unicode, поэтому ord('ñ') - 241.

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

>>> 'ñ'.encode('utf-8')
b'\xc3\xb1'
>>> 'ñ'.encode('latin-1')
b'\xf1'
>>> 'ñ'.encode('cp1252')
b'\xf1'
>>> 'ñ'.encode('cp1254')
b'\xf1'
>>> 'ñ'.encode('utf-16')
b'\xff\xfe\xf1\x00'
>>> 'ñ'.encode('utf-32')
b'\xff\xfe\x00\x00\xf1\x00\x00\x00'

Если вы звоните str.encode() без предоставления целевой кодировки, Python выберет системное значение по умолчанию - UTF-8 в вашем случае.

Подводя итог:

  • ord(s) возвращает кодовую точку Unicode для определенного символа
  • s.encode('<some encoding>') возвращает байты, сопоставленные с этим символом в предоставленной кодировке
...