Python以不同的编码获取字符代码?

12 python unicode encoding utf-8 character-codes

在一个编码中给出一个字符代码作为整数,你怎么能得到字符代码,比如utf-8和再次作为整数?

Ign*_*ams 12

UTF-8是一种可变长度编码,所以我假设你真的是指"U​​nicode代码点".使用chr()的字符代码转换为字符,对其进行解码,并使用ord()获得的代码点.

>>> ord(chr(145).decode('koi8-r'))
9618
Run Code Online (Sandbox Code Playgroud)

  • 在Python 2中,`chr`仅支持ASCII,因此只有`[0..255]`范围内的数字.使用`unichr`代替Unicode支持. (4认同)

ekh*_*oro 9

如果它们都是单字节编码,则只能将"整数"从一种编码映射到另一种编码.

这是使用"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
Run Code Online (Sandbox Code Playgroud)

注意,ord这里用于获取编码字节的序数.使用ord原始unicode字符串将给予其Unicode代码点:

>>> ord(s)
8364
Run Code Online (Sandbox Code Playgroud)

向相反的操作ord可以完成或者使用chr(在范围内的代码0127)或unichr(用于码的范围0sys.maxunicode):

>>> print chr(65)
A
>>> print unichr(8364)
€
Run Code Online (Sandbox Code Playgroud)

对于多字节编码,通常不可能进行简单的"整数"映射.

这是与上面相同的例子,但使用"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]
Run Code Online (Sandbox Code Playgroud)

"utf-8"编码使用三个字节来编码相同的字符,因此无法进行一对一映射.话虽如此,许多编码(包括"UTF-8")被设计成ASCII兼容,因此映射通常可以在0-127范围内的代码(但只平凡如此,因为该代码将始终是相同的).