首先,我在命令行中测试默认编码
>>>import sys
>>>print sys.getdefaultencoding()
'ascii'
然后,我将一个中文字符分配给变量
>>>s="汉"
>>>print s
汉
所以,我的问题是为什么ascii可以显示中文字符?
答案 0 :(得分:6)
默认编码不适用于此处;它仅在隐式转换Unicode和bytestring值时使用。
您在终端中创建了一个bytestring 。您的终端对字符进行了编码,并存储了字节。打印字节会导致终端再次解码字节。
例如,如果您的终端配置为使用UTF-8,则在回显s
时会看到此信息:
>>> s = "汉"
>>> s
'\xe6\xb1\x89'
这些是3个UTF-8字节,并将它们打印回终端会产生终端知道如何再次解码的数据:
>>> print s
汉
请注意,在终端环境中,交互式提示会在创建Unicode对象时使用检测到的终端编码来解码输入:
>>> import sys
>>> sys.stdin.encoding
'UTF-8'
>>> unicode_string = u"汉"
>>> unicode_string
u'\u6c49'
>>> print unicode_string
汉
打印会再次自动对Unicode对象进行编码以匹配终端编码。这与.py
文件中Python源代码中的字符串文字形成对比,您必须使用PEP 263 header声明文件编解码器。
最后但并非最不重要的是,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)