关于python的编码问题最近遇到比较多,现在感觉要解决编码问题主要了解下面几个问题:
1.读入的字符串的编码
2.运行环境编码
3.输出的字符串编码
4.decode和encode
关于乱码的典型例子就是:如果我们读入一个gb2312编码的字符串,然后把字符串当成utf-8编码输出的话就会产生乱码。
典型的代码如下:
在该代码中,sys.getdefaultencoding()是获取运行环境的编码,如果运行环境的编码是ASCII,遇到了多字节混排的话,就使用sys.getfilesystemencoding()的编码编码,如果是MBCS,就使用local模块中的getdefaultlocale()映射出的编码。
不同的输出:
1.在我的PyDev运行环境中编码是utf-8(即用print函数会自动把字符串当成是utf-8编码的格式输出),读入的百度网页的编码是gb2312的,所以输出的编码是utf-8,所以是乱码。但读入的谷歌网页编码是utf-8,所以输出的就没有乱码。如果把第一行的utf-8改为gbk,运行环境编码就变成了gbk,输出的百度就不会乱码,但谷歌就会乱码了。
2.在DOS命令行模式中,运行环境中的编码始终是ASCII,遇到多字节编码就使用了中文的编码输出了了,结果就是百度没有乱码,google乱码。
3.在Ubuntu系统中,运行环境中的编码是ASCII,但遇到多字节编码就是用了utf-8的编码输出,结果就是百度乱码,Google没有乱码。
不同的修正:
1.在PyDev中把从百度获取的字符串转码成utf-8输出
2.在命令行模式中把从Google获取的字符串转成gbk输出。
3.在Ubuntu系统中就可以同1修正了。
现在说的输出只是print,如果是输出到文件的话也同理。如果接收字符串的文件的编码是utf-8,写入的字符串是GBK的话,就会乱码。
decode是把字符串解码成Unicode字符串,encode是把Unicode字符串编码成相应的编码字符串。两个函数主要是用来转码的。
感受:
当我们获取一段字符串的时候就要知道该字符串的编码,比如在网页中的charset声明就是做这个用的。然后我们运行的环境使用了什么编码(主要是对python的print的函数自动转换)。最后我们输出字符串的时候就要知道接收我们字符串的程序用的编码,就不会出错了。听说现在python3.x以上对于编码问题已经很少了,都在使用utf-8编码了,感叹自己还在研究些过时的东西。