Python之所以受到程序猿&会写程序的非程序猿的热捧,很大一部分原因是因为其对字符串等数据流的方便快捷处理方式,但是,凡事有利必有弊,python2.x在处理数据过程中,尤其是在处理无比蛋疼博大精深的中文时,最大的困难就是编码问题,这也是每一个新手(比如我)都会遇到的遇到的一道大坎儿。。。要想坚持人生苦短,我用python的洗脑崇高信念,就必须大步向前,跨过这道坎儿。
1、几种常见编码
遇到一个问题,最快捷最有效的解决方式就是究其根源。因此,要想彻底搞定python中的编码问题,首先需要知道有哪些编码方式以及这些编码方式的含义。
1.1 ASCII
American Standard Code for Information Interchange,简称ASCII,是由美国人制定的一套编码标准。在计算机中,任何信息都表示为一个二进制串,每一位二进制有0和1两种取值,八位的二进制就可以表示256种状态,即一个字节(byte),ASCII码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。标准ASCII码使用7位二进制数(其余一位为0)表示英文中的大小写字母、数字0-9、标点符号和特殊的控制字符,常用的有:65~90为26个大写英文字母,97~122号为26个小写英文字母。
1.2 UNICODE
UNICOD是由ISO (国际标谁化组织)制定的一种业界编码标准。在unicode编码中,无论是半角的英文字母,还是全角的汉字,它们都是统一的”一个字符(一个文化相关的符号)“,同时,也都是统一的”两个字节(一个8位的物理存贮单元)“。
1.3 UTF-8
8-bit Unicode Transformation Format,简称UTF-8,是一种针对Unicode的可变长度字符编码,也是一种前缀码,每次8个位传输数据,使用1~4个字节表示一个符号,根据不同的符号而变化字节的长度。
ASCII是UTF-8的一个子集。
1.4 GB2312、GBK和GB18030
GB2312编码是中国制定的一种中文字符集,共收录6763个汉字。GBK是GB2312扩展后的编码方式,GBK包括了GB2312 的所有内容,同时又增加了近20000个新的汉字(包括繁体字)和符号。 GB18030在GB2312的基础上添加了几千个新的少数民族的字,它和UTF-8一样都采用多字节编码,每个字可以由1个、2个或4个字节组成。
2、Python中的编码
2.1 .py
文件编码
在文件头进行编码注释。如果不注释,默认使用ASCII编码格式,注释的格式主要有三种:
- # -*- coding: utf-8 –*-
- # coding: utf-8
- # coding = utf-8
个人比较喜欢第二种格式,简洁易懂。
2.2 程序输入数据编码
在处理数据(如,网页html)时,数据编码格式的不同往往会导致处理模块的异常,针对这种情况,首先调用detect函数检测其原始编码方式,然后进行decode解码,最后再encode编码成需要的格式。
detect函数使用:
- 引入chardet包 import chardet
,如果未安装,到这里下载,解压后进入文件夹,执行命令python setup.py install
- 调用函数,结果返回一个字典
import chardet
result = chartdet.detect(response_html)
print result # {'confidence': 0.99, 'encoding': 'utf-8'}
2.3 str
和unicode
-
str
和unicode都是basestring的子类,str是由unicode经过encode编码后的字节串, - unicode 由字符组成
-
str
使用decode
-
unicode
使用encode
- decode或encode函数可以添加
ignore
参数,如:gbkTypeStr = unicodeTypeStr.encode(“GBK“, ‘ignore’)
3、小结
python2.x中的编码问题一直是一个大坑,要想免于被坑,最好的方法就是彻底搞明白上面所说的几种编码方式,下图是在网上找到的一张编码小结图片。
在处理数据时,如果不幸入坑,试试下面几种方法:
- 编码统一
- 先解码(decode)后编码(encode)
- 因数据而异(不同编码)
- 巧用detect函数检测真正的编码方式
- 添加ignore参数