我阅读了有关Unicode,UTF-8,编码/解码以及所有内容的所有内容,但是我仍然很努力。
我做了一个简短的示例片段来说明我的问题。
我想像在这里一样打印字符串'Geïrriteerd'。如果我通过重定向到文件(例如“ Test.py>输出”)运行它,则需要使用以下代码将其正确打印到文件中
# coding=utf-8
import codecs
import sys
sys.stdout = codecs.getwriter('UTF-8')(sys.stdout)
print u'Geïrriteerd'
但是,如果我不重定向,则上面的代码将'Ge├»rriteerd'打印到终端。 如果我删除“ codecs.getwriter”行,它将再次在终端上正常打印,但会在文件中打印“Ge├»rriteerd”。
如何在两种情况下都能正常打印?
我在Windows 10上使用Python 2.7。我知道Python 3.x通常可以更好地处理unicode,但是由于其他依赖项,我无法在我的项目中使用Unicode(
)。答案 0 :(得分:1)
您的终端已设置为cp850而不是UTF-8。
运行chcp 65001
。
答案 1 :(得分:1)
您需要先“编码”您的unicode才能写入文件或显示。您实际上并不需要编解码器模块。 {{3}}提供了使用Unicode的非常好的示例。
print type(u'Geïrriteerd')
print type(u'Geïrriteerd'.encode('utf-8'))
print u'Geïrriteerd'.encode('utf-8')
with open('test.txt', 'wb') as f:
f.write(u'Geïrriteerd'.encode('utf-8'))
with open('test.txt', 'r') as f:
content = f.read()
print content
#If you want to use codecs still
import codecs
with codecs.open("test.txt", "w", encoding="utf-8") as f:
f.write(u'Geïrriteerd')
with open('test.txt', 'r') as f:
content = f.read()
print content
答案 2 :(得分:1)
由于重定向是一个shell操作,因此也有必要使用shell控制编码。幸运的是,Python提供了一个环境变量来控制编码。给定test.py
:
#!python2
# coding=utf-8
print u'Geïrriteerd'
要重定向到具有特定编码的文件,请使用:
C:\>set PYTHONIOENCODING=utf8
C:\>test >out.txt
使用PYTHONIOENCODING undefined正常运行脚本将使用终端的编码(在我的情况下为cp437
):
C:\>set PYTHONIOENCODING=
C:\>test
Geïrriteerd