假设一个人不能使用print
(因此享受自动编码检测的好处)。所以我们只剩下sys.stdout
了。然而,对于not do any sensible encoding来说,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
连接到终端)。
这是用sys.stdout
编写unicode字符串的正确方式吗?或者我应该做一些其他的事情?
编辑:有时--比如,当通过管道将输出传递给less
时--sys.stdout.encoding
将为None
。在这种情况下,上面的代码将失败。
发布于 2009-09-24 19:40:08
我不清楚为什么你不能做打印;但假设是这样,是的,在我看来这种方法是正确的。
发布于 2011-06-16 01:04:06
export PYTHONIOENCODING=utf-8
将完成这项工作,但不能将其设置在python本身上...
我们可以做的是验证是否没有设置,并告诉用户在调用脚本之前设置它:
if __name__ == '__main__':
if (sys.stdout.encoding is None):
print >> sys.stderr, "please set python env PYTHONIOENCODING=UTF-8, example: export PYTHONIOENCODING=UTF-8, when write to stdout."
exit(1)
发布于 2009-09-25 02:55:36
最好的办法是检查您是否直接连接到终端。如果是,请使用终端的编码。否则,请使用系统首选编码。
if sys.stdout.isatty():
default_encoding = sys.stdout.encoding
else:
default_encoding = locale.getpreferredencoding()
同样重要的是,始终允许用户指定他们想要的任何编码。通常我将其设置为命令行选项(如-e ENCODING
),并使用optparse
模块对其进行解析。
另一件好事是用自动编码器覆盖而不是 sys.stdout
。创建编码器并使用它,但不要使用sys.stdout
。您可以导入第三方库,这些库将编码的字节串直接写入sys.stdout
。
https://stackoverflow.com/questions/1473577
复制相似问题