暂时假设一个人无法使用print
(从而享受自动编码检测的好处)。所以这给我们留下了sys.stdout
。然而,sys.stdout
太蠢了不做任何合理的编码 http://bugs.python.org/issue4947.
现在人们阅读 Python wiki 页面打印失败 http://wiki.python.org/moin/PrintFails并尝试以下代码:
$ python -c 'import sys, codecs, locale; print str(sys.stdout.encoding); \
sys.stdout = codecs.getwriter(locale.getpreferredencoding())(sys.stdout);
然而这也不起作用(至少在 Mac 上)。太明白为什么了:
>>> import locale
>>> locale.getpreferredencoding()
'mac-roman'
>>> sys.stdout.encoding
'UTF-8'
(UTF-8 是终端可以理解的)。
于是将上面的代码修改为:
$ python -c 'import sys, codecs, locale; print str(sys.stdout.encoding); \
sys.stdout = codecs.getwriter(sys.stdout.encoding)(sys.stdout);
现在 unicode 字符串已正确发送到sys.stdout
并因此在终端上正确打印(sys.stdout
连接到终端)。
这是在中写入 unicode 字符串的正确方法吗sys.stdout
或者我应该做点别的事情?
EDIT:有时——比如说,当通过管道将输出传输到less
--sys.stdout.encoding
将None
。在这种情况下,上面的代码将会失败。