我正在为同一个项目使用Windows和Linux机器。 Windows上stdin的默认编码是cp1252,linux上的默认编码是utf-8。
我想将所有内容改为uft-8。 可能吗?我该怎么办?
答案 0 :(得分:18)
您可以通过在打印时不依赖隐式编码来实现此目的。在任何情况下都不依赖于它是一个好主意 - 隐式编码仅在打印到stdout和stdout连接到终端时使用。
更好的方法是在任何地方使用unicode
,并在任何地方使用codecs.open
或codecs.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')
答案 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)