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可以显示汉字?
默认编码不适用于此处; 它仅在隐式转换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)
| 归档时间: |
|
| 查看次数: |
40 次 |
| 最近记录: |