如何在Windows控制台中显示UTF-8

16 投票
4 回答
32298 浏览
提问于 2025-04-16 03:21

我在Windows 7上使用Python 2.6。

我从这里借了一些代码:Python、Unicode和Windows控制台

我的目标是能够在Windows控制台中显示UTF-8字符串。

显然在Python 2.6中,

sys.setdefaultencoding()

这个功能不再支持了。

不过,我在尝试使用它之前写了reload(sys),结果神奇地没有出错。

这段代码不会出错,但它显示的是一些奇怪的字符,而不是日文文本。我认为问题出在我没有成功更改Windows控制台的代码页。

这是我尝试过的方法,但都不管用:

reload(sys)
sys.setdefaultencoding('utf-8')

print os.popen('chcp 65001').read()

sys.stdout.encoding = 'cp65001'

也许你可以使用win32console来更改代码页?我尝试了我链接的网站上的代码,但它在win32console中也出错了……也许那段代码已经过时了。

这是我的代码,虽然没有出错,但打印出来的是奇怪的字符:

#coding=<utf8>
import os
import sys
import codecs



reload(sys)
sys.setdefaultencoding('utf-8')
sys.stdout = codecs.getwriter('utf8')(sys.stdout)
sys.stderr = codecs.getwriter('utf8')(sys.stderr)

#print os.popen('chcp 65001').read()
print(sys.stdout.encoding)
sys.stdout.encoding = 'cp65001'
print(sys.stdout.encoding)

x = raw_input('press enter to continue')

a = 'こんにちは世界'#.decode('utf8')
print a

x = raw_input()

4 个回答

6

改变控制台的代码页其实是没必要的,而且也不会有效果(特别是把它设置为65001会遇到一个Python的bug)。想了解更多细节,可以看看这个问题,里面还有关于如何在控制台中打印Unicode字符的方法,不管代码页是什么。

10

千万不要使用 setdefaultencoding。如果你想把 Unicode 字符串写入标准输出,应该明确地进行编码。随便改动 setdefaultencoding 会导致标准库和第三方库出现各种难以察觉的问题,因为它会在不该发生的情况下,让 strunicode 之间进行隐式转换。

是的,问题很可能是你的代码页没有设置正确。不过,使用 os.popen 并不会改变代码页;它会启动一个新的命令行窗口,改变那个窗口的代码页,然后立刻退出,根本不会影响你的控制台。我个人对 Windows 不太熟悉,所以不能告诉你如何在 Python 程序中改变控制台的代码页。

要正确地通过 UTF-8 显示 Unicode 数据,正如之前提到的,应该在打印之前明确地对字符串进行编码: print s.encode('utf-8')

15

我知道你说你在用Python 2.6,但如果你能用Python 3.3,你会发现这个问题终于得到了支持。

在启动Python之前,先使用命令 chcp 65001

你可以查看这个链接了解更多信息:http://docs.python.org/dev/whatsnew/3.3.html#codecs

在Python 3.6中,甚至不需要再使用 chcp 命令,因为Python完全绕过了字节级的控制台界面,而是使用了本地的Unicode界面。更多信息可以查看这个链接:PEP 528: Change Windows console encoding to UTF-8

正如@mbom007在评论中提到的,确保控制台使用的字体支持你想显示的字符也是很重要的。

撰写回答