我使用的是Python 2.7。这个page说:
Python的默认编码是'ascii'编码
确实我有以下内容:
>>> import sys
>>> sys.getdefaultencoding()
'ascii'
但是我打开我的翻译并输入:
>>> 'É'
'\xc3\x89'
看起来像utf8
:
>>> u'É'.encode( 'utf8' )
'\xc3\x89'
发生什么事了?默认ascii
是否会提升UnicodeEncodeError
?它是否触发了utf8
编码?
答案 0 :(得分:3)
您的终端配置为使用UTF-8。它将UTF-8数据发送给Python。 Python将数据存储在bytestring中。
当你打印那个bytestring时,终端再次将这些字节解释为UTF-8。
毫无疑问,Python实际上将这些字节解释为原始字节以外的任何字节,在Python级别上不会发生解码或编码。
如果您尝试隐式解码字节,则会抛出异常:
>>> unicode('\xc3\x89')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)
这里Python使用sys.getdefaultencoding()
并且解码失败。
对于stdin
输入交互式提示以创建Unicode文字(使用u'...'
),Python不使用sys.getdefaultencoding()
,而是使用sys.stdin.encoding
值:
>>> import sys
>>> sys.stdin.encoding
'UTF-8'
哪个Python来自PYTHIONIOENCODING
environment variable(如果已设置)或来自locale.getpreferredencoding()
:
>>> import locale
>>> locale.getpreferredencoding()
'UTF-8'
在阅读Python源文件时,Python 2会使用ASCII来解释这些文字,Python 3会使用UTF-8。两者都可以使用PEP 263源编码注释来告诉使用什么编解码器,该注释必须位于输入文件的第一行或第二行:
# coding: UTF-8