string和unicode
string object是由characters组成的sequence,而unicode object是Unicode code units组成的sequence。
string里的character是有多种编码方式的,比如单字节的ASCII,双字节的GB2312等等,再比如UTF-8。很明显要想解读string,必需知道string里的character是用哪种编码方式,然后才能进行。
Unicode code unit又是什么东西呢?一个Unicode code unit是一个16-bit或者32-bit的数值,每个数值代表一个unicode符号。在python里,16-bit的unicode,对应的是ucs2编码。32-bit对应的是ucs4编码。是不是感觉string里character的编码没什么区别?反正我现在脑子里就是这样一个印象:在Python里,ucs2或者ucs4编码的(所以才说unicode也可以解码?),我们叫做unicode object,其他编码(utf8,gbk之类)的我们就叫做string。
使用chardet判断字符串编码
安装:pip install chardet
# -*- coding:utf-8 -*- import chardet a = '哈哈' b = u'哈哈' print type(a) print type(b) print chardet.detect(a) print chardet.detect(a.encode('gbk')) print chardet.detect(b)
输出:
<type 'str'> <type 'unicode'> {'confidence': 0.75249999999999995, 'language': '', 'encoding': 'utf-8'} {'confidence': 0.72999999999999998, 'language': '', 'encoding': 'ISO-8859-1'} Traceback (most recent call last): File "C:\Users\admin\Desktop\ad.py", line 10, in <module> print chardet.detect(b) File "C:\Python26\lib\site-packages\chardet\__init__.py", line 34, in detect '{0}'.format(type(byte_str))) TypeError: Expected object of type bytes or bytearray, got: <type 'unicode'>