在Windows上设置Python终端编码

2 投票
4 回答
9470 浏览
提问于 2025-04-16 18:37

我在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")

撰写回答