2010-04-29 33 views
13

我对同一个项目使用了windows和linux机器。 windows上stdin的默认编码是cp1252,在linux上是utf-8。如何更改Python上的stdin编码

我想将所有内容都更改为uft-8。 这可能吗?我该怎么做?

感谢 爱德华

回答

18

您可以通过打印东西的时候不依赖于隐式编码做到这一点。在任何情况下都不依赖这是一个好主意 - 隐式编码仅在打印到标准输出以及标准输出连接到终端时使用。

更好的方法是随处使用unicode,并随处使用codecs.opencodecs.getwriter。你在一个对象,使用自动编码的Unicode字符串为UTF-8包裹sys.stdout,例如:

sys.stdout = codecs.getwriter('utf-8')(sys.stdout) 

,如果你使用unicode到处这只会工作,虽然。所以,到处都要使用unicode。真的,到处都是。

+0

stdin呢? – duduklein 2010-04-29 20:25:09

+2

stdin不会被自动解码,所以你必须自己做这件事。假设输入是UTF-8可能不是一个好主意,但是如果你真的想的话,还有'codecs.getreader('utf-8')(sys.stdin)'。 – 2010-04-29 21:44:32

+0

请注意,与Python 2相比,Python 3实际上会自动解码stdin:http://docs.python.org/3/library/sys.html#sys.stdin - 此行为可以按照文档中所述进行更改。 – 2014-02-08 18:00:47

12

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

读取来自stdinUTF-8,使用:

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

# Then, e.g.: 
for _ in sys.stdin: 
    print _.strip() 

要写入到UTF-8stdout,使用:

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

# Then, e.g.: 
print 'Anything' 
6

Python的自动检测标准输入的编码。我发现,当指定自动检测工作不正常的编码最简单的方法是使用PYTHONIOENCODING环境变量,如下面的例子:

pipeline | PYTHONIOENCODING="UTF-8" /path/to/your-script.py 

有关编码检测的详细信息,并在不同的这个变量平台,你可以看看sys.stdin文档。