据我所知,Python3字符串是已被解码为人类可读的字节序列,而Python3字节对象是不可人类读取的原始字节。然而,我很难理解的是,用UTF-8或ASCII编码的字符串是如何显示为以b为前缀的字符串,而不是字节序列。
string = "I am a string"
# prints a sequence of bytes, like I would expect
string.encode("UTF-16")
b'\xff\xfeI\x00 \x00a\x00m\x00 \x00a\x00 \x00s\x00t\x00r\x00i\x00n\x00g\x00'
# Prints a sequence of human readable characters, which I don't understand
string.encode("UTF-8")
b'I am a string'
为什么由UTF-8或ASCII编码的字符串不显示字节序列?
发布于 2019-08-24 15:35:03
UTF-8是一个向后兼容的ASCII超集,即任何有效的ASCII都是有效的UTF-8,而ASCII中的所有内容都是由UTF-8使用与ASCII相同的字节编码的。所以它不是“UTF-8或ASCII”,而是“只是一些ASCII”。试试其他Unicode:
>>> "café".encode("UTF-8")
b'caf\xc3\xa9'
或者其他的ASCII,在字符形式上看不会有太大帮助:
>>> "hello\f\n\t\r\v\0\N{SOH}\N{DEL}".encode("UTF-8")
b'hello\x0c\n\t\r\x0b\x00\x01\x7f'
如果可能的话,repr
of bytes
会显示可打印字符而不是\xnn
转义,因为如果您碰巧有包含ASCII的字节,这是很有帮助的。
当然,它仍然是一个格式良好的bytes
文字:
>>> b'I am a string'[0]
73
另外:来自文档
虽然字节文本和表示是基于ASCII文本的,但字节对象的行为实际上就像不可变的整数序列,序列中的每个值都受到限制,以致0 <= x< 256 (试图违反此限制的尝试将触发ValueError)。这样做是为了强调,虽然许多二进制格式包括基于ASCII的元素,并且可以使用一些面向文本的算法进行有效的操作,但对于任意二进制数据来说,情况通常并非如此。
-emphasis补充道。
最后,这是python为显示字节所做的设计选择。
https://stackoverflow.com/questions/57639294
复制相似问题