在Windows上设置Python终端编码
我在Windows的Python终端里设置字符编码的时候遇到了问题。根据官方指南,这应该很简单:
# -*- coding: utf-8 -*-
好吧,现在来测试一下:
print 'Русский'
结果却出现了一堆乱码。我到底哪里搞错了?
附注:我用的是Visual Studio 2010,不知道这是否有影响。
4 个回答
2
这段话提到的“mojibake”是指乱码,因为在Python 2中,''
是一个字节串(bytestring)字面量(literal),除非你使用了from __future__ import unicode_literals
。你在Windows控制台上打印的是utf-8字节(源代码的编码),而控制台使用的是其他字符编码(如果你看到乱码,说明编码不一样)。
>>> print(u'Русский'.encode('utf-8').decode('cp866'))
╨а╤Г╤Б╤Б╨║╨╕╨╣
解决办法是打印Unicode字符,正如@JBernardo所建议的那样:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
print(u'Русский')
如果控制台的编码支持西里尔字母,比如说是cp866
,那么这样就可以正常工作。
如果你想把输出重定向到一个文件,你可以使用PYTHONIOENCODING
这个环境变量来设置Python在输入输出时使用的字符编码:
Z:\> set PYTHONIOENCODING=utf-8
Z:\> python your_script.py > output.utf-8.txt
如果你想要打印那些在控制台编码中无法表示的Unicode字符(OEM代码页),那么你可以安装win-unicode-console
这个Python包:
Z:\> py -m pip install win_unicode_console
Z:\> py -m run your_script.py
3
你应该使用unicode:
print u'Русский'
或者换用python3(默认就是unicode)。
2
更新:请查看 J.F. Sebastian的回答,那里有更好的解释和解决方案。
# -*- coding: utf-8 -*-
是用来设置源文件的编码方式,而不是输出的编码方式。
在你打印字符串之前,必须使用和你的终端相同的编码方式来编码这个字符串。根据你的情况,我猜测你的代码页是西里尔字母(cp866)。所以,
print 'Русский'.encode("cp866")