我所知道的:
b'\xce\xb8'.decode('UTF-8')
给出'θ',因为为该工作设计了encode()函数-解码字节。
我想知道的是,剂量python3 shell模式具有一些默认配置来控制以下行为(Python3)。
>>> sys.getdefaultencoding()
'utf-8'
>>> b'\xce\xb8'.decode()
'θ'
>>> b'\xce\xb8'
b'\xce\xb8'
>>> b'\x41'
b'A'
>>> print(b'\xce\xb6')
b'\xce\xb6'
>>> print(b'\xce\xb6'.decode('utf8'))
ζ
似乎shell模式使用ASCII作为默认编码,而不是utf8。
问题是,这是真的吗?如果是,那么配置所在的路径是什么?
答案 0 :(得分:2)
这与编码无关。 Python只是在外壳中向您展示您刚刚赋予它的价值,从更确切的意义上讲。尝试以下方法:
a = b'\xce\xb8'
print(a)
结果:
θ
因此,正如您所期望的那样,“ a”确实编码为UTF-8。您只是误解了Python回显到控制台的内容。
顺便说一句,我也认为您没有按照自己的想法使用'b'前缀。看来您使用的是Python2.X。在该版本的Python中,“ b”前缀将被忽略。我知道这是因为它不会出现在回显的结果中。看到这里:
Python 2.x:
>>> b'\xce\xb8'
'\xce\xb8'
Python 3.X
>>> b'\xce\xb8'
b'\xce\xb8'
因此,在Python 2.X中,带有和不带有'b'的结果相同。在Python 3.X中,您获得的行为与在Python 2.X中所获得的行为不同。我对Python 3.X所做的工作不多,但是我相信这是因为在3.X中表示字符串的方式发生了变化。
PS:如果您真的只是在乎Python如何将字符串回显给您,我不知道有什么方法可以改变它。但是,我不知道为什么这对您很重要。
答案 1 :(得分:1)
如果字节3的值在ASCII范围内,则Python 3将字节表示为等效的ASCII字符,否则它将显示转义的十六进制值。
从docs中输入byte
类型:
在字节文本中仅允许使用ASCII字符(无论声明的源代码编码如何)。必须使用适当的转义序列将大于127的任何二进制值输入到字节文本中。
这是一个故意的设计决策(来自同一文档)
要强调的是,虽然许多二进制格式都包含基于ASCII的元素,并且可以通过某些面向文本的算法进行有效地操作,但对于任意二进制数据通常不是这种情况
解释器不显示ASCII范围以外的字节的字符,因为它不知道这些字节是否编码为UTF-8,其他某种编码,甚至根本不表示文本数据。
正如用户Steve在其答案中指出的那样,此行为与编码无关。它是不可配置的。如果要查看与UTF-8编码的字节串相对应的字符,请解码为str
。