我使用Python 2.7。本页说:
Python的默认编码是' ascii '编码
实际上我有以下内容:
>>> import sys
>>> sys.getdefaultencoding()
'ascii'
但是我打开我的解释器并输入这个:
>>> 'É'
'xc3x89'
看起来像utf8
:
>>> u'É'.encode( 'utf8' )
'xc3x89'
发生了什么事?默认的ascii
是否引发了UnicodeEncodeError
?它是否触发了utf8
编码?
您的终端配置为使用UTF-8。它将UTF-8数据发送给Python。Python将这些数据存储在一个字节串中。
当你输出该字节串时,终端会再次将这些字节解释为UTF-8。
Python实际上没有将这些字节解释为原始字节以外的任何东西,Python级别没有解码或编码。
如果您试图隐式解码字节,则会抛出异常:
>>> unicode('xc3x89')
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
环境变量(如果设置了)或locale.getpreferredencoding()
中获取:
>>> import locale
>>> locale.getpreferredencoding()
'UTF-8'
当读取Python源文件时,Python 2将使用ASCII来解释这些文字,Python 3将使用UTF-8。两者都可以使用PEP 263源编码注释来告知要使用哪种编解码器,该注释必须位于输入文件的第一行或第二行:
# coding: UTF-8