Python尝试确定终端编码,并在打印到终端时使用该编码。sys.stdout.encoding包含检测到的编码。getdefaultencoding()是未指定编码时用于对Unicode字符串进行编码的编码。在
示例(Windows控制台中的Python 2):>>> import sys
'ascii'
>>> sys.stdout.encoding
'cp437'
打印到终端使用sys.stdout.encoding。我使用在终端编码中无效的Unicode字符来查看错误消息中的编码:
^{pr2}$
这里我不指定编码,它使用默认值:>>> u'\xc1'.encode()
Traceback (most recent call last):
File "", line 1, in
UnicodeEncodeError: 'ascii' codec can't encode character u'\xc1' in position 0: ordinal not in range(128)
示例(Windows控制台中的Python 3):>>> import sys
>>> sys.getdefaultencoding()
'utf-8'
>>> sys.stdout.encoding
'cp437'
打印仍使用sys.stdout.encoding:>>> print('\xc1')
Traceback (most recent call last):
File "", line 1, in
File "D:\dev\Python35\lib\encodings\cp437.py", line 19, in encode
return codecs.charmap_encode(input,self.errors,encoding_map)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\xc1' in position 0: character maps to
但是编码默认值是Python 3的默认值utf-8:>>> '\xc1'.encode()
b'\xc3\x81'
重定向输出
重定向Python脚本的输出时,sys.stdout.encoding的值可以更改。这可以用PYTHONIOENCODING环境变量覆盖。在
Python2重定向不检测编码。它将默认为ascii:C:\>py -2 -c "import sys;print(sys.stdout.encoding)" | more
None
Python3使用ANSI编码(因Windows本地化版本而异):C:\>py -3 -c "import sys;print(sys.stdout.encoding)" | more
cp1252
使用环境变量重写:C:\>set PYTHONIOENCODING=utf8
C:\>py -2 -c "import sys;print(sys.stdout.encoding)" | more
utf8
C:\>py -3 -c "import sys;print(sys.stdout.encoding)"
utf8