Python如何简单解决window下乱码的问题

刚接触python,写了个程序,想打包成exe以便其他机器可以运行,但是,总是会乱码!搞了一晚上,还是没能解决!
按照这个对cmd进行修改之后,还是会出现其他问题

python 文件里的中文在 windows 下运行乱码

想问下大家,不知道有没有一个终极的解决办法可以一劳永逸的!

目的:方便python写的程序能在其他机器运行

谢谢了~

补充

Python也有GUI吧,不知道使用界面来替代CMD可以吗,这样是不是就能解决了呢?

阅读 25.1k
3 个回答

简单的一句话就是:操你妈的微软,操你妈的cmd!因为微软的技术落后,国际化和本地化的很多本来应该很简单的事情,最后变得非常复杂。

详细的你可以看看资料。网上对CP936代码页、cmd不支持utf-8,以及Windows需要设置系统编码的抱怨简直披天盖地。

说件往事。我曾经试图用Bitvise SSH Client去连接Linux主机。这个SSH软件本身不错,SFTP/SSH/Tunnel/终端4合一,并且带自动保存密码、公私钥认证,相当全功能。但就是因为他调用的是cmd.exe的图形外壳去做终端,结果造成了连接到Linux主机上根本配不上UTF8编码,再骂一次微软之后忍痛抛弃了啊。

我的建议是:

  1. 如果要方便在其他Windows机器上运行,就要最低程度的减少使用标准输入输出。学Unix工具的风格,没事不输出,有事最低程度输出。
  2. 如果实在非输出不可,那么就提供一个配置文件,或提供命令行参数,让用户至少可以在运行时指定输出内容的编码。
  3. 如果是不可避免的内容输出,那么同时提供标准输出,和导出到文件的命令行选项。
  4. 对简体中文系统,你可能需要同时支持:UTF-8、GB18030和GBK编码才够用。就算如此,你也要做好一旦转换了,就要抛弃某些转换不了的字符,造成信息丢失的觉悟。
  5. 惹不起躲的起,直接标准输出到终端的事情,如果因为微软而惹上了麻烦,我们总可以在骂草泥马的同时,想尽一切办法不碰。
  6. 别忘了还有标准输入。如果要识别中文的标准输入,也要按照输出的以上想法逆向操作。
  7. 这么想来,GUI也许是躲避cmd的一个好办法。因为我们如果把用户交互从文字终端的泥潭中拽出来,那么一切问题也就都不存在了。
  8. 如果做了GUI界面,那与此同时也别忘了把GUI做成可选项,保留用传统的参数调用,去执行软件的工作模式(这样是为了方便别人在自动化操作中调用你的程序)。
  9. 自己一定要在机器上准备一个cmd的完全的替代品——不要追求等效了,要完全替代(因为cmd就算不考虑图形前端,自己本身也不是UTF8)。我推荐直接安装cygwin环境,带上python开发的软件包。把程序先全用Unicode搞定了,最后再去零散对付杂七杂八的其他编码,这才是营生之道。

乱码问题在跨平台下一直是头疼的问题。以下一些原则可以让该问题最小化:

  1. 源代码统一用UTF8编码。

下面的python头很常见吧:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
  1. 对标准输入输出进行编码检测和转换,即:将stdin转换为python内部编码Unicode;在进行stdout输出前转换为系统编码再输出。

由于Linux系统是UTF8编码,所以直接print "你好"就可以直线显示而不会乱码。
而中文Windows系统是GBK编码,所以直接print "你好"就会乱码,解决方法如下:

print u"你好".encode("GBK")

看了链接中所给的解决方案,我怀疑是终端的编码修改为UTF8了,所以直接print u"你好"正常显示。默认的终端编码是和系统编码一致的,这时就需要encode为对应的编码来显示。

(发现了segmentfault的markdown编辑器的一个bug:

下面的python头很常见吧:
#!/usr/bin/env python
# -- coding: utf-8 --

预览时代码区是正常的,可保存后查看却是普通文本,必须空一行才能显示为代码。)

新手上路,请多包涵

下面这个方法可以彻底解决!
1、确保py文件是UTF-8编码存档的。
2、在CMD窗口输入CHCP 65001 回车。(65001是win系统UTF-8的代码)
3、选择字体Lucida Console。说明:如果想在CMD显示更多的字体,在注册表(路径:HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionConsoleTrueTypeFont)中添加就好了。添加的字体需要是定宽的(fixed-width)。问题彻底解决。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏