2024-05-20 14:09:41 发布
网友
如果我跑了
print(chr(244).encode())
我得到两个字节的结果b'\xc3\xb4'。为什么?我想244可以被编码成一个字节!在
I imagine the number 244 can be encoded into one byte!
当然,如果您设计的编码只能处理256个码位,那么所有这些码位都可以编码成一个字节。在
但是,如果设计一种可以处理Unicode的111000+代码点的编码,显然不能将它们全部打包到一个字节中。在
如果您的唯一目标是使代码尽可能紧凑,那么可以将256个初始字节值中的大部分用于公共代码点,而只保留一些作为不太常见的代码点的起始字节。在
但是,如果只对单字节值使用较低的128,则有一些很大的优势。尤其是如果您设计它,使每个字节都明确地是一个7位字符、一个起始字节或一个连续字节。这使得该算法实现起来更简单、速度更快,您可以始终向前或向后扫描到字符的开头,您可以使用传统的面向字节(strchr)搜索字符串中的ASCII文本,一个简单的启发式方法可以非常可靠地检测您的编码,您可以始终检测到截断字符串的开始/结束而不是误解了它,等等。所以,这正是UTF-8的作用。在
strchr
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值是文本,而不是字节。在
chr().encode()
chr()
将您的数字作为整数列表传递给bytes()可调用:
bytes()
这只符合拉丁语-1编解码器的结果,因为根据设计,前256个Unicode码位直接映射到拉丁语1字节。在
当然,如果您设计的编码只能处理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)也可以,但是编码为不同的字节:
但是拉丁1和ebcdic500编解码器只能编码255个码位;UTF-8可以管理所有Unicode标准。在
如果希望将数字244解释为字节值,则不应使用
chr().encode()
;chr()
生成unicode值,而不是“byte”,然后编码会根据具体的编解码器生成不同的结果。这是因为unicode值是文本,而不是字节。在将您的数字作为整数列表传递给
^{pr2}$bytes()
可调用:这只符合拉丁语-1编解码器的结果,因为根据设计,前256个Unicode码位直接映射到拉丁语1字节。在
相关问题 更多 >
编程相关推荐