首页 » Program » Python » 正文

记一次python2.7中文乱码的解决历程

0x00 前言

最近用python写个小爬虫,想回复下feeling,却被中文乱码的问题搞得寝食难安,不过经过两天的各种搜索尝试,还是解决掉了这个问题。

0x01 乱码前奏

我的环境:debian8+python2.7
那是一个风雨交加的夜晚,本人打算写个小小的爬虫,当我高兴地按下回车,控制台输出 UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position……,这好办,因为python默认是ascii编码,只有1个字节,当然无法编码中文,加上几行就ok:
import sys
reload(sys)
sys.setdefaultencoding(‘utf-8’)
好,再来一次,冥冥之中我觉得事情不会这么顺利,果然,中文乱码隆重登场!

0x02 中文乱码

看见中文乱码,如下图:

第一感觉,稳住别乱!Python2.7中文乱码就像家常便饭,都是见过大风大浪的人了…….,控制台和写入文件夹一样的乱码,有了PHP中文乱码的经验,先看看哪里的编码没统一吧,如下:
1.python源码编码:utf-8
2.python源码的文件编码:utf-8
3.Python系统编码:utf-8(见0x01)
4.控制台编码:utf-8
5.文件系统编码:utf-8
6.爬取的json文件编码:貌似gbk
为什么说貌似呢,因为那是一个json文件,没META,但是看了下别的网页都是gbk。那应该就是这个问题了,那也好办,heroName[n].decode(‘gbk’).encode(‘utf-8’)就行咯,再运行一次,心想这下该没问题了,好的,真的没乱码了,如图:

但是输出的并不是人名啊,而是一串无意义的中文,这就奇怪了,输出了中文就证明解码应该没错了啊,那试试用gb2312解码
heroName[n].decode(‘gb2312’).encode(‘utf-8’),结果:
UnicodeDecodeError: ‘gb2312’ codec can’t decode bytes in position 4-5,接着又各种decode各种encode,几乎都组合了一遍还是各种乱……

0x03 一行解决

经过各种搜索,突然发现可以把get下来的网页再encoding,于是尝试加了这句:
heroListHtml.encoding = ‘utf-8’,这下都是utf-8了,该和谐了吧,于是第n次运行,终于见到了正常的中文!从来都没觉得原来中文是这么诱人……

0x04 结语

遇到乱码,别乱,没什么特殊的话就是编码不统一的问题了,仔细找,多搜索,应该就ok了,有时候,与其找问题原因,还不如避开问题,python2这个编码问题真是烦人啊,py3这个编码就好多了,不用decode/encode,直接中文变量都没事。最后,送神图一张
#
#
#             ┌─┐                  ┌─┐
#      ┌──┘ ┴───────┘ ┴──┐
#       │                                          │
#       │                ───                  │
#       │  ─┬┘                └┬─        │
#       │                                          │
#       │                 ─┴─                 │
#       │                                          │
#       └───┐                    ┌───┘
#                 │                     │
#                  │                    │
#                  │                    │
#                  │                    └──────────────┐
#                  │                                                             │
#                  │                                                             ├─┐
#                  │                                                             ┌─┘
#                  │                                                             │
#                  └─┐  ┐  ┌───────┬──┐  ┌──┘
#                       │ ─┤ ─┤                 │ ─┤ ─┤
#                       └──┴──┘             └──┴──┘
#                                      神兽保佑 !
#                                      永无乱码 !
#/

Comment

please input captcha *