有关python编码的问题

时间:2015-04-21 07:41:24

标签: python encoding python-2.x

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

>>>import sys
>>>print sys.getdefaultencoding()
'ascii'

然后,我将一个中文字符分配给变量

>>>s="汉"
>>>print s
汉

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

1 个答案:

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