乱码产生的原因
乱码产生的根本原因是字节流转换字符前后不一致导致。只要掌握了这个核心,就能解决乱码问题。python2中使用了一些“trick”(没有区分字符和字节流),所以理解起来有些困难。在python中遇到没有指定为unicode的string,就理解为字节流! 字节流,没有编码,只有字节,所以在转换字符时经常会出现乱码。
源文件编码、字符串编码
在python中有2个地方的编码要注意,源文件的编码、字符串的编码,只要设置正确了就不会出现乱码。
源文件编码
在源文件的第一行或者第二行一定要声明文件的编码方式并且与文件编码一致,通常会将源文件保存为utf8,声明也是utf8,如
1 # coding=utf8
或
1 #coding:utf8
如果不指定源码文件编码格式,文件中包含非ascii字符就会出现错误。
SyntaxError: Non-ASCII character ‘\xe4’ in file test_encoding.py on line 3, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
这是因为,如果不指定源文件编码,python解释器会按照默认的字符集ascii来解码文件,由于中文不属于ascii字符集,所以会出错。
字符串编码
字符串编码分两种情况,
指定了unicode:在字符串前边加u,如u'你好' ,这种情况不会出现乱码;
没指定unicode:普通字符串的写法,如'你好' ,这种情况字符串的编码与源文件编码一致;当字符串编码与控制台编码不一致时,就会出现乱码,这是因为python中的字符串就是字节数组,由于没有声明为unicode,所以按照windows terminal的默认编码gbk来解码(从字节数组转为字符),utf8的字节数组转为gbk的字符,肯定是不兼容的,所以出现了乱码。如
解决办法很简单,指定为unicode或者使用decode函数将字符串转为unicode编码。如
1 '你好' #这里没有指定编码,所以就是utf8的字节流,输出到控制台时,转为gbk,因为由utf8字节流--转--->gbk,不兼容,所以,就出现乱码了。 2 u'你好' #指定字符串为unicode编码 3 '你好'.decode('utf8')#将utf8的字符串解码为unicode
因为这里用到了decode函数,所以说一下decode、encode函数
decode(), 解码就是将字节流转为字符,python中特指,其他字符集(比如,utf8、gbk、isoo8859-1)解码为unicode
encode(),编码就是从字符转为字节流,python中特指,unicode编码为其他字符集(比如,utf8、gbk、isoo8859-1)
关于这个知识点可以这样理解,unicode包含世界所有的字符,编码、解码都要围绕unicode来进行,否则由于不兼容就会出错;从unicode到utf8就是编码,从utf8到unicode就是解码;
出现字符串的地方,都指定为unicode编码。
总结
综上所述,最简单的办法就是声明的编码类型与源文件一致,出现字符串的地方都指定为unicode编码,能解决99%的乱码问题。python3默认就是unicode,不会出现这些问题了。
————————————————
版权声明:本文为CSDN博主「干净的句号」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wangjun5159/article/details/52771277