如果我跑
print(chr(244).encode())
我得到两个字节的结果b'\ xc3 \ xb4'。这是为什么?我想数字244可以编码成一个字节!
答案 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所做的。