字符串编码产生的乱码着实让人头疼……
关于字符串和编码的知识,可以参考廖雪峰大大的博客字符串和编码
那么有没有办法完全正确的检测字符集编码呢?答案是:没有!参考how-to-determine-the-encoding-of-text
但是在Python有两种还比较简单的方法:
1、chardet
chardet包提供detect方法
安装pip install chardet
使用chardet.detect方法(该方法传入的参数是bytes或bytearray,不支持str)
检测出的编码是utf-8
,注意到还有个confidence
字段,表示检测的概率是0.99(即99%)。
data = '离离原上草,一岁一枯荣'.encode('utf-8')
chardet.detect(data)
# 输出
{'encoding': 'utf-8', 'confidence': 0.99, 'language': ''}
传说比chardet更可靠,说是安装chardet后结果更好
安装pip install bs4
使用(同时支持bytes 和 str,str的时候编码是None)
from bs4 import UnicodeDammit
data = '离离原上草,一岁一枯荣'.encode('utf-8')
dammit = UnicodeDammit(data)
print(dammit.unicode_markup)
print(dammit.detector.chardet_encoding)
# 输出
离离原上草,一岁一枯荣
utf-8
data = '离离原上草,一岁一枯荣'
dammit = UnicodeDammit(data)
print(dammit.unicode_markup)
print(dammit.original_encoding)
# 输出
离离原上草,一岁一枯荣
None
为什么UnicodeDammit好用,因为UnicodeDammit 已经综合考虑了chardet 的结果,chrdet 是学习了大量的文本,然后再来算出最有可能的编码方式
UnicodeDammit 是
1. 先从申明的编码方式尝试解析
2. 尝试从开头的几个字符开始解析
3. chardet 检测出来的推荐编码
4. utf-8 解析
5. windows-1252 解析