有关python编码的问题

sto*_*ren 1 python encoding python-2.x

首先,我在命令行中测试默认编码,

>>>import sys
>>>print sys.getdefaultencoding()
'ascii'
Run Code Online (Sandbox Code Playgroud)

然后,我为变量分配了一个汉字,

>>>s="?"
>>>print s
?
Run Code Online (Sandbox Code Playgroud)

所以,我的问题是为什么ascii可以显示汉字?

Mar*_*ers 6

默认编码不适用于此处; 它仅在隐式转换Unicode和bytestring值时使用.

在终端中创建了一个字节串.您的终端对字符进行了编码,并存储了字节.打印字节会导致终端再次解码字节.

例如,如果您的终端配置为使用UTF-8,您将在回显时看到s:

>>> s = "?"
>>> s
'\xe6\xb1\x89'
Run Code Online (Sandbox Code Playgroud)

这些是3个UTF-8字节,并将它们打印回终端会产生终端知道如何再次解码的数据:

>>> print s
?
Run Code Online (Sandbox Code Playgroud)

请注意,在终端环境中,交互式提示使用它检测到的终端编码来在创建Unicode对象时解码输入:

>>> import sys
>>> sys.stdin.encoding
'UTF-8'
>>> unicode_string = u"?"
>>> unicode_string
u'\u6c49'
>>> print unicode_string
?
Run Code Online (Sandbox Code Playgroud)

打印会再次自动对Unicode对象进行编码以匹配终端编码.这与.py文件中Python源代码中的字符串文字形成对比,在文件中,您必须使用PEP 263标头声明文件编解码器.

最后但并非最不重要的sys.getdefaultencoding()是,用于隐式转换; 将字节串与Unicode值连接时,例如:

>>> unicode_string + s
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)