17

给定一个字符代码作为一种编码中的整数,你怎么能得到字符代码,比如说,utf-8,然后又作为整数?

4

3 回答 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 回答