我在同一个项目中使用 Windows 和 Linux 机器。Windows 上标准输入的默认编码是 cp1252,Linux 上是 utf-8。
我想将所有内容更改为 utf-8。可能吗?我该怎么做?
这个问题是关于 Python 2 的;对于 Python 3,请参阅Python 3:如何指定标准输入编码
我在同一个项目中使用 Windows 和 Linux 机器。Windows 上标准输入的默认编码是 cp1252,Linux 上是 utf-8。
我想将所有内容更改为 utf-8。可能吗?我该怎么做?
这个问题是关于 Python 2 的;对于 Python 3,请参阅Python 3:如何指定标准输入编码
您可以通过在打印内容时不依赖隐式编码来做到这一点。在任何情况下都不依赖它是一个好主意——隐式编码仅在打印到标准输出和标准输出连接到终端时使用。
更好的方法是unicode
到处使用,并且到处使用codecs.open
或使用codecs.getwriter
。您使用以下方法包装sys.stdout
一个对象,该对象会自动将您的 unicode 字符串编码为 UTF-8:
sys.stdout = codecs.getwriter('utf-8')(sys.stdout)
不过,这仅在您在任何地方都使用 unicode 时才有效。所以,到处使用 unicode。真的,无处不在。
这是一个老问题,但仅供参考。
要读取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'
Python 自动检测标准输入的编码。我发现在自动检测无法正常工作时指定编码的最简单方法是使用PYTHONIOENCODING环境变量,如下例所示:
pipeline | PYTHONIOENCODING="UTF-8" /path/to/your-script.py
有关不同平台上的编码检测和此变量的更多信息,您可以查看sys.stdin文档。
我使用的一个简单的代码片段,它适用于 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)