给定一个字符代码作为一种编码中的整数,你怎么能得到字符代码,比如说,utf-8,然后又作为整数?
user975135
问问题
26279 次
3 回答
14
UTF-8 是一种可变长度编码,所以我假设您的意思是“Unicode 代码点”。用于chr()
将字符代码转换为字符,对其进行解码,并用于ord()
获取代码点。
>>> ord(chr(145).decode('koi8-r'))
9618
于 2011-12-22T07:24:43.993 回答
12
如果它们都是单字节编码,则只能将“整数”从一种编码映射到另一种编码。
这是一个使用“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 字符串上使用将给出其unicode 代码点:ord
>>> ord(s)
8364
ord
可以使用chr
(对于 to 范围内0
的代码127
)或unichr
(对于 to 范围内的代码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 范围内的代码进行映射(但只是微不足道,因为代码总是相同的)。
于 2011-12-22T19:56:24.863 回答
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
٤
于 2011-12-22T07:55:33.407 回答