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

rus*_*sso 15 python windows console utf-8

我在Windows 7上使用Python 2.6

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

我的目标是能够在Windows控制台中显示uft-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'
Run Code Online (Sandbox Code Playgroud)

也许您可以使用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()
Run Code Online (Sandbox Code Playgroud)

Mar*_*som 15

我知道你说你正在使用Python 2.6,但是如果你能够使用Python 3.3,你会发现它最终得到支持.

chcp 65001在启动Python之前使用该命令.

请参阅http://docs.python.org/dev/whatsnew/3.3.html#codecs

在Python 3.6中,甚至不再需要使用该chcp命令,因为Python完全绕过了字节级控制台接口,而是使用本机Unicode接口.请参阅PEP 528:将Windows控制台编码更改为UTF-8.

正如@ mbom007的评论中所述,确保控制台配置了支持您尝试显示的字符的字体也很重要.


hab*_*bit 10

从来没有 曾经使用setdefaultencoding.如果要将unicode字符串写入stdio,请显式编码.胡闹周围setdefaultencoding会造成STDLIB模块和第三方模块都在可怕的微妙的方式允许之间的隐式转换打破str,并unicode当它不应该发生.

是的,问题很可能是您的代码页未正确设置.但是,使用os.popen不会改变代码页; 它会生成一个新shell,更改代码页,然后立即退出而不会影响您的控制台.我个人对Windows并不熟悉,所以我无法告诉你如何从python程序中更改控制台的代码页.

如前所述,通过来自python的utf-8正确显示unicode数据的方法是在打印字符串之前对其进行显式编码: print s.encode('utf-8')

  • @otz,该文章未涉及的其他一些内容:混合文本(unicode字符串)和字节无论如何都是无意义的操作.如果字节代表文本,则无论如何都应将它们解码为unicode.如果你想编写合理的代码,增加无意义操作在没有任何警告的情况下意外成功的可能性并不是最好的.正如我已经说过的,许多现有的python代码依赖于ASCII作为默认值; 如果隐式编码被关闭,代码就会破坏. (3认同)
  • 关于“永远不要使用 setdefaultencoding”。我不认为你的推理是有效的——充其量是不够的。事实上,将其设置为“utf-8”就可以了,因为 ascii 只是它的一个子集。如果通过设置它在模块中出现任何问题,则这是该模块的错误。如果您反对,能否举出反例? (2认同)
  • @otz,stdlib以及许多第三方库假定ASCII是默认的python编码.有一个很好的讨论为什么在这里设置默认编码是愚蠢的:http://faassen.n--tree.net/blog/view/weblog/2005/08/02/0 (2认同)

Dai*_*ood 6

更改控制台代码页是不必要的,并且不起作用(特别是,将其设置为65001会运行到Python错误中).有关详细信息,以及如何将Unicode字符打印到控制台,无论代码页如何,请参阅此问题.