假设一个人不能使用print
(并因此享受自动编码检测的好处)。所以这给我们留下了sys.stdout
. 然而,sys.stdout
它是如此愚蠢以至于不做任何明智的编码。
现在阅读 Python wiki 页面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
还是我应该做其他事情?
编辑:有时——比如说,当将输出管道传输到less
——sys.stdout.encoding
时None
。在这种情况下,上面的代码将失败。