Понимание юникода и кодировки в Python - PullRequest
0 голосов
/ 18 января 2019

Когда я ввожу следующее в консоли python 2.7

>>>'áíóús'
'\xc3\xa1\xc3\xad\xc3\xb3\xc3\xbas'
>>>u'áíóús'
u'\xe1\xed\xf3\xfas'

Я получаю вышеуказанный вывод. Какая разница между двумя? Я понимаю основы Unicode и различные виды кодирования, такие как UTF8, UTF16 и т. Д. Но я не понимаю, что печатается на консоли или как это понимать.

1 Ответ

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

u'áíóús' - это строка text . То, что вы видите в REPL, - это каноническое представление этого объекта:

>>> print u'áíóús'
áíóús
>>> print repr(u'áíóús')
u'\xe1\xed\xf3\xfas'

Такие вещи, как \xe1, относятся к шестнадцатеричным ординалам каждого символа:

>>> [hex(ord(c)) for c in u'áíóús']
['0xe1', '0xed', '0xf3', '0xfa', '0x73']

Только последний символ был в диапазоне ascii, то есть порядковые номера в range(128), поэтому только последний символ "s" отчетливо виден в Python 2.x:

>>> chr(0x73)
's'

'áíóús' - это строка байтов . То, что вы видите напечатанным, является кодировкой тех же текста символов, а эмулятор терминала принимает кодировку:

>>> 'áíóús'
'\xc3\xa1\xc3\xad\xc3\xb3\xc3\xbas'
>>> u'áíóús'.encode('utf-8')
'\xc3\xa1\xc3\xad\xc3\xb3\xc3\xbas'
...