Python 2.7非ASCII字符打印乱码问题求助
解决Python输出非ASCII字符乱码的问题
哈哈,这个乱码问题我可太熟了!你已经做对了源码编码声明的部分,但问题出在终端/控制台的编码和Python输出的编码不匹配上,跟代码本身关系不大~
先给你拆解下原因:你加的#-*- coding:utf-8 -*-已经告诉Python用UTF-8解析源码,所以字符串"Öüç"在Python里是正确的Unicode对象(Python 2里是UTF-8编码的str,Python 3里是原生Unicode str)。但输出到终端时,你的终端用了错误的编码(比如CP1252、ISO-8859-1这类单字节编码)去解码UTF-8的字节,才会出现├û├╝├ğ这种乱码。
下面是几个靠谱的解决方法:
方法一:把终端编码改成UTF-8(最直接)
这是从根源解决问题的方式:
- Windows CMD:打开CMD后先运行命令
chcp 65001,切换到UTF-8编码,再执行你的Python脚本。 - Linux/macOS终端:打开终端偏好设置,找到“字符编码”选项,选择UTF-8(一般默认就是,但如果被改过的话需要调回来)。
方法二:针对Python 2,显式适配终端编码
如果你还在使用Python 2,可以在代码里把字符串编码成终端支持的字节再输出:
# -*- coding:utf-8 -*- import sys # 自动获取终端的输出编码,避免硬编码 print "Öüç".encode(sys.stdout.encoding)
要是你知道终端用的是特定编码(比如土耳其常用的CP1254),也可以直接写:
# -*- coding:utf-8 -*- print "Öüç".encode('cp1254')
方法三:升级到Python 3(推荐)
Python 3对Unicode的支持是原生的,处理编码问题省心太多!你的代码改成下面这样,只要终端是UTF-8编码,就能直接正确显示:
# 编码声明可以加也可以不加,Python 3默认支持UTF-8源码 print("Öüç")
最后再补个小细节:你看到的├û├╝├ğ其实是UTF-8字节被CP1252解码后的结果——比如Ö的UTF-8字节是0xC3 0x96,在CP1252里0xC3对应├,0x96对应û,拼起来就成了乱码,这也反过来验证了是终端编码不匹配的问题~
内容的提问来源于stack exchange,提问作者Mete Tikici
相关产品推荐
相关产品推荐

