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

时间:2011-12-22 07:16:25

标签: python unicode encoding utf-8 character-codes

在一个编码中给出一个字符代码作为整数,如何在utf-8中再获取字符代码并再次作为整数?

3 个答案:

答案 0 :(得分:11)

UTF-8 is a variable-length encoding,所以我假设你真的是指“U​​nicode代码点”。使用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(适用于0127范围内的代码)或unichr(适用于代码)范围0sys.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
٤