21

我在同一个项目中使用 Windows 和 Linux 机器。Windows 上标准输入的默认编码是 cp1252,Linux 上是 utf-8。

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

这个问题是关于 Python 2 的;对于 Python 3,请参阅Python 3:如何指定标准输入编码

4

4 回答 4

18

您可以通过在打印内容时不依赖隐式编码来做到这一点。在任何情况下都不依赖它是一个好主意——隐式编码仅在打印到标准输出和标准输出连接到终端时使用。

更好的方法是unicode到处使用,并且到处使用codecs.open或使用codecs.getwriter。您使用以下方法包装sys.stdout一个对象,该对象会自动将您的 unicode 字符串编码为 UTF-8:

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

不过,这仅在您在任何地方都使用 unicode 时才有效。所以,到处使用 unicode。真的,无处不在。

于 2010-04-29T14:12:18.647 回答
18

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

要读取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'
于 2014-12-11T14:58:04.967 回答
10

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

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

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

于 2016-02-06T02:35:24.153 回答
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)
于 2019-10-18T11:30:09.030 回答