如何在Windows控制台中显示utf-8
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Windows控制台中显示utf-8相关的知识,希望对你有一定的参考价值。
我在Windows 7上使用Python 2.6
我从这里借了一些代码:Python, Unicode, and the Windows console
我的目标是能够在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()
我知道你说你正在使用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的评论中所述,确保控制台配置了支持您尝试显示的字符的字体也很重要。
永远不要使用setdefaultencoding
。如果要将unicode字符串写入stdio,请显式编码。使用setdefaultencoding
进行修改将导致stdlib模块和第三方模块一样,通过允许str
和unicode
之间的隐式转换(如果不应该发生),以可怕的微妙方式打破。
是的,问题很可能是您的代码页未正确设置。但是,使用os.popen
不会更改代码页;它会生成一个新shell,更改其代码页,然后立即退出而不会影响您的控制台。我个人对Windows并不熟悉,所以我无法告诉你如何从python程序中更改控制台的代码页。
如前所述,通过utf-8从python正确显示unicode数据的方法是在打印字符串之前对其进行显式编码:print s.encode('utf-8')
更改控制台代码页是不必要的,并且不起作用(特别是,将其设置为65001运行到Python bug)。有关详细信息,请参阅this question,以及如何将Unicode字符打印到控制台,而不管代码页如何。
Windows无法在控制台中正确支持UTF-8。我知道在控制台中显示日语的唯一方法是将(在XP上)控制面板的区域和语言选项,高级选项卡,非Unicode程序的语言更改为日语。重新启动后,打开控制台并运行“chcp”以查找日语控制台的代码页。然后打印在正确的代码页中显式编码的Unicode字符串或字节字符串。
以上是关于如何在Windows控制台中显示utf-8的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Windows 上的 c++ 控制台应用程序打印 UTF-8
如何在windows的DOS窗口中正常显示中文(UTF-8字符)
Windows 7 中文版命令行如何修改字符编码为UTF-8?