使用带有默认ascii编码的非ascii字符?

时间:2014-03-17 13:40:41

标签: python-2.7 utf-8 character-encoding ascii python-unicode

我使用的是Python 2.7。这个page说:

  

Python的默认编码是'ascii'编码

确实我有以下内容:

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

但是我打开我的翻译并输入:

>>> 'É'
'\xc3\x89'

看起来像utf8

>>> u'É'.encode( 'utf8' )
'\xc3\x89'

发生什么事了?默认ascii是否会提升UnicodeEncodeError?它是否触发了utf8编码?

1 个答案:

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