首先,我在命令行中测试默认编码,
>>>import sys
>>>print sys.getdefaultencoding()
'ascii'
然后,我给一个变量赋了一个汉字,
>>>s="汉"
>>>print s
汉
那么,我的问题是为什么ascii可以显示汉字?
最佳答案
默认编码在这里不适用;它仅在 Unicode 和 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)
关于python - 关于python编码的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29765897/