python中的stdout编码

Eri*_*son 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
Run Code Online (Sandbox Code Playgroud)

关于PYTHONIOENCODING60个问题所以我想这是一个常见的问题,但是如果你不知道,这是完成的,因为sys.stdout.encoding == None那时你只能打印ascii字符,所以例如print "åäö"会抛出异常..

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

另一个解决方案是更改stdout编解码器,sys.stdout = codecs.getwriter('utf8')(sys.stdout)我猜这是正确的答案,反映了对该问题的评论.

Len*_*bro 8

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

首先:

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

第二个:设置环境变量,然后再次使用smae命令启动一个新进程.那太难看了.

所以,除非你打算成为唯一一个使用你的程序的人,否则你不应该这样开始.但是,如果你打算使用你的程序是唯一的,就勇往直前.

更深入的解释

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

但是通过打印编码数据,您没有这个问题.即使输出为管道输出,以下内容也能完美运行:

print u'ÅÄÖ'.encode('UTF8')
Run Code Online (Sandbox Code Playgroud)

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