Python学习笔记:中文编码问题

来源:互联网 发布:深圳专业java培训机构 编辑:程序博客网 时间:2024/05/16 15:49

编程环境

用的版本2.7.11,使用notepad++和python的IDLE运行程序。


问题描述

在编写python爬虫时遇到一个问题,对服务器提交post数据时,数据中有中文。


在提交时,如果在.py文件里,直接给某一个字符串赋值为中文,比如

mystr='查询'

服务器的反馈会出现问题。

然而在使用wireshark抓包跟踪通讯逻辑时,找到了某一个post的项的值为'\262\351\321\257' 


于是,我进行了如下的测试:

在python的shell中,输入mystr='查询',然后直接输入mystr得到它的编码。

'\xb2\xe9\xd1\xaf'

输入mystr='\262\351\321\257' ,然后输入mystr得到同样的回答

'\xb2\xe9\xd1\xaf'

居然是一样的。


我对自己的python程序进行了抓包,发现post数据中该项是一个9位的编码,肯定是编码方式出现了问题。


基础知识

这里需要知道中文在不同的编码方式里编码是不同的,常见的有gb2312和utf-8

notepad++对源程序的.py文件使用utf-8来进行编码,也就是说先把中文转化成utf8的编码,再进行储存。

python的编译器在读取某个.py文件时也是按照utf-8的原则读取的。

网页中的中文,读取html代码之后,会发现是中文是按照gb2312编码。

所以这里猜测python的shell使用gb2312来编码的,也就是和网页是同样的,这就是为什么使用shell和文件里,同样的包含中文代码,却有不同的执行效果。


解决方案

在文件中,使用如下语句,首先,先解码成utf-8,然后再编码成gb2312。这样可以使他保持和网页同样的编码。
对于涉及到中文的正则表达式,如果网页使用gb2312,那么正则表达式中的中文也需要按照如下的方法先转换编码,再执行查找。

mystr='查询'.decode('utf-8').encode('gb2312')
0 0
原创粉丝点击