Python получить код символа в другой кодировке? - PullRequest
11 голосов
/ 22 декабря 2011

Учитывая код символа как целое число в одной кодировке, как вы можете получить код символа, скажем, в utf-8 и снова как целое число?

Ответы [ 3 ]

11 голосов
/ 22 декабря 2011

UTF-8 - кодировка переменной длины , поэтому я предполагаю, что вы действительно имели в виду "кодовая точка Unicode". Используйте chr(), чтобы преобразовать код символа в символ, расшифруйте его и используйте ord(), чтобы получить кодовую точку.

>>> ord(chr(145).decode('koi8-r'))
9618
9 голосов
/ 22 декабря 2011

Вы можете отобразить «целое число» из одной кодировки в другую, только если они являются однобайтовыми кодировками.

Вот пример использования "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 (но только тривиально, потому чтокод всегда будет одинаковым).

2 голосов
/ 22 декабря 2011

Вот пример того, как работает танец кодирования / декодирования:

>>> s = b'd\x06'             # perhaps start with bytes encoded in utf-16
>>> map(ord, s)              # show those bytes as integers
[100, 6]
>>> u = s.decode('utf-16')   # turn the bytes into unicode
>>> print u                  # show what the character looks like
٤
>>> print ord(u)             # show the unicode code point as an integer
1636
>>> t = u.encode('utf-8')    # turn the unicode into bytes with a different encoding
>>> map(ord, t)              # show that encoding as integers
[217, 164]

Надеюсь, это поможет: -)

Если вам нужно создать юникод непосредственно из целого числа, используйте unichr :

>>> u = unichr(1636)
>>> print u
٤
...