如何在python上更改stdin编码

时间:2010-04-29 14:07:34

标签: python encoding

我正在为同一个项目使用Windows和Linux机器。 Windows上stdin的默认编码是cp1252,linux上的默认编码是utf-8。

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

5 个答案:

答案 0 :(得分:18)

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

更好的方法是在任何地方使用unicode,并在任何地方使用codecs.opencodecs.getwriter。将sys.stdout包装在一个对象中,该对象使用自动编码您的unicode字符串为UTF-8,例如:

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

这只有在你到处使用unicode时才有效。所以,到处使用unicode。真的,到处都是。

答案 1 :(得分:17)

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

要从UTF-8阅读stdin,请使用:

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

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

要将UTF-8写入stdout,请使用:

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

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

答案 2 :(得分:8)

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

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

有关不同平台上的编码检测和此变量的详细信息,请查看sys.stdin文档。

答案 3 :(得分:0)

在python 3.7及更高版本中,您可以使用sys.stdin.reconfigure(encoding='utf-8')

推荐

py2:https://stackoverflow.com/a/4546129/7721525

py3:https://stackoverflow.com/a/16549381/7721525

答案 4 :(得分:0)

我使用的一个简单代码段在ubuntu上对我有用:python2.7和python3.6

from sys import version_info
if version_info.major == 2:  # for python2
    import codecs
    # for stdin
    UTF8Reader = codecs.getreader('utf8')
    sys.stdin = UTF8Reader(sys.stdin)
    # for stdout
    UTF8Writer = codecs.getwriter('utf8')
    sys.stdout = UTF8Writer(sys.stdout)
elif version_info.major == 3:  # for python3
    import codecs
    # for stdin
    UTF8Reader = codecs.getreader('utf8')
    sys.stdin = UTF8Reader(sys.stdin.buffer)
    # for stdout
    UTF8Writer = codecs.getwriter('utf8')
    sys.stdout = UTF8Writer(sys.stdout.buffer)