在处理字符串时,常常会遇到不知道字符串是何种编码,如果不知道字符串的编码就不能将字符串转换成需要的编码。面对多种不同编码的输入方式,是否会有一种有效的编码方式?chardet是一个非常优秀的编码识别模块。
安装chardet
如果安装了Anaconda,chardet就已经可用了。否则,需要在命令行下通过pip安装:
$ pip install chardet
官方地址:http://pypi.python.org/pypi/chardet
使用chardet
当我们拿到一个bytes时,就可以对其检测编码。用chardet检测编码,只需要一行代码:
>>> chardet.detect(b'Hello, world!')
{'encoding': 'ascii', 'confidence': 1.0, 'language': ''}
检测出的编码是ascii,注意到还有个confidence字段,表示检测的概率是1.0(即100%)。
我们来试试检测GBK编码的中文:
>>> data = '哈哈哈,我是中文'.encode('gbk')
>>> chardet.detect(data)
{'encoding': 'GB2312', 'confidence': 0.7407407407407407, 'language': 'Chinese'}
检测的编码是GB2312,注意到GBK是GB2312的超集,两者是同一种编码,检测正确的概率是74%,language字段指出的语言是'Chinese'。
对UTF-8编码进行检测:
>>> data = '哈哈哈,我是中文'.encode('utf-8')
>>> chardet.detect(data)
{'encoding': 'utf-8', 'confidence': 0.99, 'language': ''}
我们再试试对日文进行检测:
>>> data = '蒼井そら'.encode('euc-jp')
>>> chardet.detect(data)
{'encoding': 'EUC-JP', 'confidence': 0.99, 'language': 'Japanese'}
可见,用chardet检测编码,使用简单。获取到编码后,再转换为str,就可以方便后续处理。
chardet支持检测的编码列表:
Big5, GB2312/GB18030, EUC-TW, HZ-GB-2312, and ISO-2022-CN (繁体和简体中文)
EUC-JP, SHIFT_JIS, and ISO-2022-JP (日文)
EUC-KR and ISO-2022-KR (韩文)
KOI8-R, MacCyrillic, IBM855, IBM866, ISO-8859-5, and windows-1251 (俄文)
ISO-8859-2 and windows-1250 (匈牙利闻)
ISO-8859-5 and windows-1251 (保加利亚文)
ISO-8859-1 and windows-1252 (西欧文)
ISO-8859-7 and windows-1253 (希腊语)
ISO-8859-8 and windows-1255 (Visual and Logical Hebrew)
TIS-620 (泰语)
UTF-32 BE, LE, 3412-ordered, or 2143-ordered (with a BOM)
UTF-16 BE or LE (with a BOM)
UTF-8 (with or without a BOM)
ASCII
领取专属 10元无门槛券
私享最新 技术干货