如何在python上更改stdin编码

dud*_*ein 17 encoding stdin stdout python-2.x

我在同一个项目中使用windows和linux机器.Windows上stdin的默认编码是cp1252,linux上的默认编码是utf-8.

我想把一切都变成uft-8.可能吗?我该怎么做?

Tho*_*ers 18

您可以通过在打印时不依赖于隐式编码来实现此目的.在任何情况下都不依赖于它是一个好主意 - 隐式编码仅在打印到stdout和stdout连接到终端时使用.

更好的方法是在unicode任何地方使用,使用codecs.opencodecs.getwriter在任何地方使用.您可以使用以下内容将sys.stdout自动编码您的unicode字符串的对象包装为UTF-8,例如:

sys.stdout = codecs.getwriter('utf-8')(sys.stdout)
Run Code Online (Sandbox Code Playgroud)

但是,只有在所有地方使用unicode时才会有效.所以,到处使用unicode.真的,无处不在.

  • stdin不会自动解码,因此您必须自己完成此操作.假设输入是UTF-8可能是一个坏主意,但是如果你真的想要的话,那就是`codecs.getreader('utf-8')(sys.stdin). (2认同)

Tom*_*yen 18

这是一个老问题,但仅供参考.

要阅读UTF-8stdin,使用:

UTF8Reader = codecs.getreader('utf8')
sys.stdin = UTF8Reader(sys.stdin)

# Then, e.g.:
for _ in sys.stdin:
    print _.strip()
Run Code Online (Sandbox Code Playgroud)

要写入UTF-8stdout,使用:

UTF8Writer = codecs.getwriter('utf8')
sys.stdout = UTF8Writer(sys.stdout)

# Then, e.g.:
print 'Anything'
Run Code Online (Sandbox Code Playgroud)


joh*_*hnf 9

Python自动检测stdin的编码.我发现在自动检测无法正常工作时指定编码的最简单方法是使用PYTHONIOENCODING环境变量,如下例所示:

pipeline | PYTHONIOENCODING="UTF-8" /path/to/your-script.py
Run Code Online (Sandbox Code Playgroud)

有关在不同平台上编码检测和此变量的更多信息,您可以查看sys.stdin文档.