python3 shell模式可以为某些字节输出utf-8字符,而不能为其他字节输出,原因是什么?

时间:2019-03-10 04:36:40

标签: python utf-8

我所知道的:

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。

问题是,这是真的吗?如果是,那么配置所在的路径是什么?

2 个答案:

答案 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