12 python unicode encoding utf-8 character-codes
在一个编码中给出一个字符代码作为整数,你怎么能得到字符代码,比如utf-8和再次作为整数?
Ign*_*ams 12
UTF-8是一种可变长度编码,所以我假设你真的是指"Unicode代码点".使用chr()的字符代码转换为字符,对其进行解码,并使用ord()获得的代码点.
>>> ord(chr(145).decode('koi8-r'))
9618
Run Code Online (Sandbox Code Playgroud)
如果它们都是单字节编码,则只能将"整数"从一种编码映射到另一种编码.
这是使用"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(在范围内的代码0到127)或unichr(用于码的范围0到sys.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范围内的代码(但只平凡如此,因为该代码将始终是相同的).