Вы можете отобразить «целое число» из одной кодировки в другую, только если они являются однобайтовыми кодировками.
Вот пример использования "iso-8859-15" и«cp1252» (он же «ANSI»):
>>> s = u'€'
>>> s.encode('iso-8859-15')
'\xa4'
>>> s.encode('cp1252')
'\x80'
>>> ord(s.encode('cp1252'))
128
>>> ord(s.encode('iso-8859-15'))
164
Обратите внимание, что здесь используется ord
для получения порядкового номера кодированного байта .Использование ord
в исходной строке Unicode даст ее кодовую точку Unicode :
>>> ord(s)
8364
Операция, обратная к ord
, может быть выполнена с использованием либо chr
(для кодов вдиапазон 0
до 127
) или unichr
(для кодов в диапазоне от 0
до sys.maxunicode
):
>>> print chr(65)
A
>>> print unichr(8364)
€
Для многобайтовых кодировок простое "целое число"картирование обычно невозможно.
Вот тот же пример, что и выше, но с использованием "iso-8859-15" и "utf-8":
>>> s = u'€'
>>> s.encode('iso-8859-15')
'\xa4'
>>> s.encode('utf-8')
'\xe2\x82\xac'
>>> [ord(c) for c in s.encode('iso-8859-15')]
[164]
>>> [ord(c) for c in s.encode('utf-8')]
[226, 130, 172]
Кодирование utf-8 использует три байта для кодированияодин и тот же символ, поэтому сопоставление один к одному невозможно.Сказав это, многие кодировки (включая utf-8) предназначены для ASCII-совместимости, поэтому отображение обычно возможно для кодов в диапазоне 0-127 (но только тривиально, потому чтокод всегда будет одинаковым).