使用Python 3进行字符编码

时间:2014-01-16 22:01:53

标签: python python-3.x encoding

如果我跑

print(chr(244).encode())

我得到两个字节的结果b'\ xc3 \ xb4'。这是为什么?我想数字244可以编码成一个字节!

3 个答案:

答案 0 :(得分:2)

您的默认语言环境似乎使用UTF-8作为输出编码。

0-127范围之外的任何代码点都使用variable-width UTF-8 codec中的多个字节进行编码。

您必须使用不同的编解码器将该代码点编码为一个字节。 Latin-1 encoding可以很好地管理它,而EBCDIC 500 codec (codepage 500)也可以,但编码到不同的字节:

>>> print(chr(244).encode('utf8'))
b'\xc3\xb4'
>>> print(chr(244).encode('latin1'))
b'\xf4'
>>> print(chr(244).encode('cp500'))
b'\xcb'

但Latin-1和EBCDIC 500编解码器只能编码255个码点; UTF-8可以管理所有Unicode标准。

如果您希望将数字244解释为字节值,则不应使用chr().encode(); chr()生成一个unicode值,而不是'byte',然后编码会根据确切的编解码器产生不同的结果。那是因为unicode值是文本,而不是字节。

将您的号码作为整数列表传递给bytes()可调用的代码:

>>> bytes([244])
b'\xf4'

这恰好符合Latin-1编解码器结果,因为前256个Unicode码点按设计直接映射到拉丁语1个字节。

答案 1 :(得分:0)

字符#244是带有CIRCUMFLEX的U + 00F4 LATIN SMALL LETTER O,在UTF-8中确实编码为0xc3 0xb4。如果要使用单字节编码,则需要指定它。

答案 2 :(得分:0)

  

我想数字244可以编码成一个字节!

当然,如果你设计一个只能处理256个代码点的编码,那么它们都可以编码成一个字节。

但是如果你设计一个可以处理所有Unicode的111000+代码点的编码,显然你不能将它们全部打包成一个字节。

如果您的唯一目标是尽可能地使事情变得紧凑,那么您可以将大部分256个初始字节值用于公共代码点,并且仅为不常见的代码点保留一些作为起始字节。

但是,如果您只使用较低的128作为单字节值,则有一些很大的优点。特别是如果你设计它使每个字节明确地是一个7位字符,一个起始字节或一个连续字节。这使得算法实现起来更加简单且速度更快,您可以始终向前或向后扫描到字符的开头,您可以使用传统的面向字节(strchr)搜索来搜索字符串中的ASCII文本,一个简单的启发式方法可以非常可靠地检测你的编码,你总是可以检测截断的字符串开始/结束而不是误解它等等。所以,这正是UTF-8所做的。

Wikipedia很好地解释了UTF-8。 Rob Pike,UTF-8的发明者之一,详细解释了设计历史。