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

首页 » 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