python中的stdout编码

时间:2013-04-01 08:41:13

标签: python unicode character-encoding

我不应该用这个开始所有我的python程序吗?做这样的执行官时有什么特别的遗失吗?

#!/usr/bin/python
import os, sys
if sys.stdout.encoding == None:
    os.putenv("PYTHONIOENCODING",'UTF-8')
    os.execv(sys.executable,['python']+sys.argv)
print sys.stdout.encoding

60 questions about PYTHONIOENCODING所以我想这是一个常见问题,但如果您不知道,这样做是因为当sys.stdout.encoding == None时您只能打印ascii字符,例如print "åäö"会抛出异常..

编辑当stdout是管道时,这种情况发生在我身上; python encoding.py|cat会将编码设置为无

另一个解决方案是更改codec of stdout sys.stdout = codecs.getwriter('utf8')(sys.stdout),我猜这是正确的答案,请回答对该问题的评论。

1 个答案:

答案 0 :(得分:8)

是的,有充分的理由不启动所有类似的Python程序。

首先:

如果Python不知道stdout支持的编码,则

sys.stdout.encoding为None。在大多数情况下,这是因为它根本不支持任何编码。在你的情况下,这是因为stdout是一个文件,而不是终端。但它可以设置为None,因为Python也无法检测到终端的编码。

其次:设置环境变量,然后再次使用smae命令启动新进程。那太难看了。

所以,除非你打算成为唯一一个使用你的程序的人,否则你不应该那样开始。但如果你计划成为唯一使用你的程序的人,那就继续吧。

更深入的解释

Python 2下更好的通用解决方案是将stdout视为它是什么:一个8位接口。这意味着你打印到stdout的任何东西应该是8位。当您尝试打印Unicode数据时会出现错误,因为打印将尝试将Unicode数据编码为stdout的编码,如果它为None,则它将采用ASCII,并且失败,除非您设置了PYTHONIOENCODING。

但是通过打印编码数据,您没有这个问题。即使输出管道输出,以下工作也很完美:

print u'ÅÄÖ'.encode('UTF8')

(但是,这将失败在Python 3下,因为在Python 3下,stdout不再是8位IO,你应该给它Unicode数据,它将自行编码。如果你给它二进制数据,它将打印表示。因此,在Python 3中,你首先没有这个问题。)