在一个编码中给出一个字符代码作为整数,如何在utf-8中再获取字符代码并再次作为整数?
答案 0 :(得分:11)
UTF-8 is a variable-length encoding,所以我假设你真的是指“Unicode代码点”。使用chr()
将字符代码转换为字符,对其进行解码,然后使用ord()
获取代码点。
>>> ord(chr(145).decode('koi8-r'))
9618
答案 1 :(得分: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
请注意,此处ord
用于获取编码字节的序号。在原始unicode字符串上使用ord
将为其 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 :(得分:2)
以下是编码/解码舞蹈的工作原理示例:
>>> 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]
希望这会有所帮助: - )
如果您需要直接从整数构造unicode,请使用 unichr :
>>> u = unichr(1636)
>>> print u
٤