python IDLE 控制台输出乱码问题如何解决?
近日使用了python交互终端写程序,发现一个奇怪的现象。
使用windows记事本编写py输出简单的一句话:
#!/user/bin/python # _*_ coding:GBK _*_ print "今朝有旧今朝醉?"
通过cmd运行如下:
将coding修改为UTF-8:
# _*_ coding:GBK _*_
依然可以正常显示,因为UTF-8兼容GBK大多数字符,注意,这里的coding指的是文件的解码。
接下来使用IDLE来编辑这个py:
好,乱码来了:
为什么捏?难道记事本跟python的IDLE存在差异?首先想到的就是两者保存文件编码差异导致,先确定cmd用的是什么解码:
确定是GBK,再看一下记事本和IDLE保存的编码:
记事本:
IDLE:
需要说明一下,ANSI是不同国家地区字符集的统称,GBK就是中国地区的ANSI编码。
可以看到,IDLE给出的选项默认是UTF-8,这跟记事本使用GBK编码保存文件不一致,于是记事本保存的py输出不会乱码,IDLE保存的py输出则会乱码。
那么将IDLE默认编码设置为GBK,也就是上图中的Locale-defined系统默认看看:
继续乱码,好吧,然并卵:
这个时候我再次用记事本打开再保存,发现一个细节,记事本的默认保存编码变成了UTF-8:
通常应用程序识别到文件是什么编码就会用对应的编码打开或保存:也就是说,python这个IDLE在我上次修改编码并没有生效,依旧UTF-8保存,简直坑人......
不过,这到底是windows坑了IDLE还是IDLE的问题?再次使用记事本打开,修改coding为GBK,然后以UTF-8保存,结果:
这又是什么毛病?GBK不能有BOM头?
说明一下:什么是BOM头,BOM Byte Order Mark头就是在文件开头的几个不表示任何字符的字节,通常的作用就是用来给程序区分文件内容是大端还是小端模式处理的,但是一般情况下,GBK和UTF-8都是无BOM的格式,对于UTF-8的文件如果存在BOM,那么BOM头就用来表示文件的编码为UTF-8。
经过刚才的测试,可得知IDLE是不会在UTF-8加BOM的,但是用记事本保存UTF-8的时候,它就会加BOM,而python编译的时候发现GBK编码有BOM果断的报了个错。所以,例如这个windows的记事本,就是用这种方式(前面加EF BB BF)来判断文件是否为UTF-8,却在某些时候造成不便,例如python编译,还有就是php,在html中头三个字符什么都没有就是占着位子,特别尴尬。
另外,再指出windows文本编辑器的其他毛病,例如这个Unicode其实就是UTF-16,Unicode是码表,不是编码方式,为何混为一谈?这是有历史原因的,早期的Unicode和UTF-16是可以做到键码一对一,但是这并不意味着微软应该固执的沿用下来:
big endian就是大端序
经过这次测试也总结出一点,使用windows记事本等非专业的文本编辑器,我建议使用默认方式保存即可,但是最好不要跟其他编辑器混用,避免出现UTF-8的BOM头问题,使用其他专业文本编辑器,最好保存为utf-8无BOM模式。虽然很多大牛和培训班都会让初学者用记事本敲代码,以训练语法,但是某些时候会造成很多困扰,不值得提倡。
上一篇: 蓝牙条码扫描枪怎么与电脑配对使用?
下一篇: Codeforces Round #688 (Div. 2) D. Checkpoints gym 102881 L. The Expected Square A. Sticker Album
推荐阅读
-
python IDLE 控制台输出乱码问题如何解决?
-
解决vscode python print 输出窗口中文乱码的问题
-
解决IntelliJ IDEA 控制台输出中文乱码问题(史上最简单)
-
python学习教程,如何解决Python中文编码乱码问题?
-
ArcGIS API for javascript如何解决打印输出的中文为乱码问题?
-
解决PyCharm控制台输出乱码的问题
-
Python遍历zip文件输出名称时出现乱码问题的解决方法
-
解决Python pandas plot输出图形中显示中文乱码问题
-
解决Python3控制台输出的UnicodeEncodeError: ‘gbk‘ codec can‘t encode character ‘\u30fb‘ in position 0:问题
-
【已解决】解决IntelliJ IDEA控制台输出中文乱码问题