如何将unicode打印到终端和文件重定向

时间:2018-12-03 09:40:27

标签: python windows python-2.7 unicode python-unicode

我阅读了有关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(

)。

3 个答案:

答案 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