python 2.7 -使用默认ascii编码的非ascii字符



我使用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

相关内容

  • 没有找到相关文章

最新更新