被sys.setdefaultencoding
删除是有原因的site
,您不应该使用reload(sys)
它来恢复它。相反,我的解决方案是什么都不做,Python 根据 ENV LANG 变量或 Windows 编码自动检测chcp
编码。
$ python
Python 2.7.3 (default, Sep 26 2012, 21:51:14)
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> import os
>>> sys.stdout.encoding
'UTF-8'
>>> os.environ["LANG"]
'pl_PL.UTF-8'
>>> print u"\xabtest\xbb"
«test»
>>>
但是,当编码没有您想要的字符时,这可能会导致问题。相反,您应该尝试优雅地降级 - 显示您想要的字符的机会接近 0(因此您应该尝试使用纯 ASCII 版本,或使用 Unidecode 来显示可用的输出(或干脆失败))。您可以尝试捕获异常并打印基本版本的字符串。
$ LANG=C python
Python 2.7.3 (default, Sep 26 2012, 21:51:14)
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> import os
>>> sys.stdout.encoding
'ANSI_X3.4-1968'
>>> os.environ["LANG"]
'C'
>>> print u"\xabtest\xbb"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xab' in position 0: ordinal not in range(128)
>>>
但是有一个叫做 Windows 的问题在 Unicode 支持方面存在问题。虽然在技术上chcp 65001
应该可以工作,但除非您使用 Python 3.3,否则它实际上并不能工作。Python 使用可移植stdio.h
的,但cmd.exe
需要特定于 Windows 的调用,例如WriteConsoleW()
. 实际上,只有 8 位编码才能可靠地工作(例如 CP437)。
解决方法是使用其他正确支持 Unicode 的终端,例如 Cygwin 的控制台或 Python 附带的 IDLE。