python3字符编码

2024-05-20 14:09:41 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我跑了

print(chr(244).encode())

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


Tags: 编码字节encodeprintchrxc3xb4
3条回答

I imagine the number 244 can be encoded into one byte!

当然,如果您设计的编码只能处理256个码位,那么所有这些码位都可以编码成一个字节。在

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

如果您的唯一目标是使代码尽可能紧凑,那么可以将256个初始字节值中的大部分用于公共代码点,而只保留一些作为不太常见的代码点的起始字节。在

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

Wikipedia很好地解释了UTF-8。^{UTF解释了发明者的历史。在

字符244是带扬抑符的U+00F4拉丁文小写字母O,在UTF-8中确实被编码为0xc3 0xb4。如果要使用单字节编码,则需要指定它。在

您的默认区域设置似乎使用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'

但是拉丁1和ebcdic500编解码器只能编码255个码位;UTF-8可以管理所有Unicode标准。在

如果希望将数字244解释为字节值,则不应使用chr().encode()chr()生成unicode值,而不是“byte”,然后编码会根据具体的编解码器生成不同的结果。这是因为unicode值是文本,而不是字节。在

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

^{pr2}$

这只符合拉丁语-1编解码器的结果,因为根据设计,前256个Unicode码位直接映射到拉丁语1字节。在

相关问题 更多 >