对于人类能够识别的字符,计算机会根据某一对应关系将其转换为二进制形式进行保存。这个对应关系就是字符编码表,即什么样的字符对应什么样的二进制编码。这种字符编码表往往是多种多样的,因此,如果我们想要将一个未知编码的二进制文件转换为可读文本进行显示,就需要考其使用的是什么类型的字符编码。关于字符编码的进一步介绍见文章字符集和字符编码。

现实中,往往根据各种字符编码的特征字符来猜测当前文件使用的是什么类型的字符编码。但是许多字符对于不同字符编码是通用的,区别在于每种编码可能使用不同的字节序列来存储同一字符,根据这一特性再进一步处理。在Python中,chardet库能够提供了实现字符编码自动检测的函数。chardet支持绝大部分常见字符编码的识别,其官方仓库见:chardet。chardet安装指令如下:

pip install chardet

1 使用

基础使用

chardet提供detect函数接口实现字符编码的自动检测。detect函数接受一个参数,即非Unicode字符串。它返回一个字典,其中包含自动检测到的字符编码和范围为0到1的置信度,还有语言类型。

# 导入库
import urllib.request
import chardet
# 读取网站
rawdata = urllib.request.urlopen('http://baidu.com/').read()
# 可以看到使用的是ascii编码
chardet.detect(rawdata)
{'encoding': 'ascii', 'confidence': 1.0, 'language': ''}
# 读取网站
rawdata = urllib.request.urlopen('http://en.people.cn/').read()
# 可以看到使用的是utf-8编码
chardet.detect(rawdata)
{'encoding': 'utf-8', 'confidence': 0.99, 'language': ''}
# 创建utf-8字节类型数据
data = bytes('hello, world', encoding='utf-8')
print(data)
chardet.detect(data)
b'hello, world'{'encoding': 'ascii', 'confidence': 1.0, 'language': ''}
# bytes类型可以直接通过python的decode函数进行解码
data.decode('ascii')
'hello, world'
# 创建utf-8字节类型数据,这里可以看到utf-8是最高效的编码方式。
data = bytes('hello, world!你好世界!', encoding='utf-8')
print(data)
chardet.detect(data)
b'hello, world!\xe4\xbd\xa0\xe5\xa5\xbd\xe4\xb8\x96\xe7\x95\x8c\xef\xbc\x81'{'encoding': 'utf-8', 'confidence': 0.9690625, 'language': ''}
# bytes类型可以直接通过python的decode函数进行解码
data.decode('utf-8')
'hello, world!你好世界!'
data = bytes('你好世界', encoding='GBK')
# 识别可能错误
chardet.detect(data)
{'encoding': None, 'confidence': 0.0, 'language': None}
# 需要更丰富的字符数据提高识别率
data = bytes('你好世界,你好', encoding='GBK')
chardet.detect(data)
{'encoding': 'GB2312', 'confidence': 0.99, 'language': 'Chinese'}

大量文本识别

如果您正在处理大量文本,您可以调用UniversalDetector,以加快识别速度。下面的代码首先创建一个UniversalDetector对象,然后对大型文本分块识别,每个文本块用其检测方法feed。如果检测器达到最小置信阈值,它将设置detector.done为True,进而输出当前文本的字符编码。

import urllib.request
from chardet.universaldetector import UniversalDetectorusock = urllib.request.urlopen('http://baidu.com/')
detector = UniversalDetector()
for line in usock.readlines():detector.feed(line)if detector.done: break
detector.close()
usock.close()
print(detector.result)
{'encoding': 'ascii', 'confidence': 1.0, 'language': ''}

对于多个文件或多个字符串,也可以使用UniversalDetector加快识别速度。


from chardet.universaldetector import UniversalDetectortexta = bytes('hello, world', encoding='utf-8')
textb = bytes('你好世界,你好', encoding='GBK')detector = UniversalDetector()
for data in [texta,textb]:# 检测器重置detector.reset()detector.feed(data)if detector.done: breakdetector.close()print(detector.result)
{'encoding': 'ascii', 'confidence': 1.0, 'language': ''}
{'encoding': 'GB2312', 'confidence': 0.99, 'language': 'Chinese'}

UnicodeDammit的使用

UnicodeDammit是beautifulsoup的内置库, 用于猜测字符编码。在UnicodeDammit中集成了chardet模块使得我们可以快速获取字符编码。

from bs4 import UnicodeDammitdata = bytes('你好世界,你好', encoding='GBK')
dammit = UnicodeDammit(data)
# 解码结果
print(dammit.unicode_markup)
# 打印编码结果
print(dammit.original_encoding)
# 或直接调用chardet
print(dammit.detector.chardet_encoding)
你好世界,你好
gb2312
GB2312

2 参考

  • chardet
  • 字符集和字符编码

[python] 基于chardet识别字符编码相关推荐

  1. Python 文件处理、字符编码(二)

    引子 1.问题:给你一个文件 "兼职白领学生空姐模特护士联系方式.txt" ,如何查看内容? 答: 安装文本编辑器软件 选中右键,利用文本编辑器软件打开 查看 or 写入 保存,关 ...

  2. Python学习日记day4 字符编码

    1.内存和硬盘都是用来存储的. CPU:速度快 硬盘:永久保存 2.文本编辑器存取文件的原理(nodepad++,pycharm) 打开编辑器就可以启动一个进程,是在内存中的,所以在编辑器编写的内容也 ...

  3. 12.Python文件操作与字符编码

    字符编码 字符编码的作用 计算机只认识0和1组成的二进制序列,因此任何文件中的内容(比如"hello neuedu","你好,东东教程"这些字符串)要想被计算机 ...

  4. Python入门系列之字符编码

    1.字符编码 **[**所谓unicode] unicode是一种类似于符号集的抽象编码,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储.也就是它只是一种内部表示,不能直接保存.所以 ...

  5. Python 3 文件和字符编码

     一.文件: 打开文件的模式有: r,只读模式(默认).w,只写模式. 不可读,不存在则创建:存在则删除内容a,追加模式. 可读,不存在则创建:存在则只追加内容 "+"表示可以同时 ...

  6. python可以处理任何字符编码文本_python数据类型、字符编码、文件处理

    介绍: 1.什么是数据? 例:x=10,10是我们要存储的数据 2.为何数据要分不同的类型? 数据是用来表示状态的,不同的状态用不同的类型的数据去表示 1.数据类型 1.数字(整形,长整形,浮点型,复 ...

  7. python默认采用什么字符编码_Python01.2.字符编码-输入输出

    1.字符编码 计算机存储的任何数据,包括各种文本.图片.音视频文件等等,实际上都是一串二进制数字01字节序列组成的.一个字节Byte(B)是8个比特bit(b).而字符,自然就是符号了.比如说二十六个 ...

  8. python对浮点类型的数据进行格式化_(自用)Python Log2 数据类型、字符编码、格式化...

    数据类型 1.整数 十六进制可以使用0x+数字0-9(字母a-f). 2.浮点数 一般使用科学计数法,用e代替10,比如1.2e5,为1.2×10^5. 3.字符串 可以使用单引号' ',或者双引号& ...

  9. Android动态识别字符编码

    最近碰到一个需求,读取txt文本内容并加载到textview中,但是测试发现当txt文件编码为GBK时会乱码,查阅了很多资料,大多数都是通过判断文件前三字节实现字符编码的识别,但是实际发现读取到的前三 ...

  10. python 基于机器学习识别验证码

    1.背景     验证码自动识别在模拟登陆上使用的较为广泛,一直有耳闻好多人在使用机器学习来识别验证码,最近因为刚好接触这方面的知识,所以特定研究了一番.发现网上已有很多基于machine learn ...

最新文章

  1. 完全背包问题 POJ1384
  2. AT串口抽象层的设计思路及代码实现
  3. 服务降级-多版本支持
  4. 自学JAVA5.18
  5. 【Vue】脚手架 Vue CLI 的使用
  6. python的数据类型_Python支持哪些数据类型
  7. MySQL默认数据库简介
  8. C 怎么读取Cpp文件_opencv从yaml文件中读取矩阵(c++)
  9. std::map的insert和下标[]访问
  10. 【Android】6.3 ProgressDialog
  11. java 解决死锁_如何解决java中的死锁问题
  12. 【转】给网站添加X-UA-Compatible标签
  13. ASP.NET MVC3+EF4+Oracle入门实例(五)
  14. 防止系统页面被加载进 iframe 子窗口
  15. 深入理解Kafka cruise control
  16. 宝塔面板mysql命令_宝塔面板常用命令
  17. vue解决mintui中使用MessageBox弹窗拦截,移动端多次点击手机的物理返回键,选择确定后页面返回不正确问题
  18. 谱聚类(spectral clustering)
  19. 【web学习】如何绑定自己的Lofter独立域名——域名解析篇
  20. 微型真空气体采样泵气路的流导计算

热门文章

  1. mac访问服务器文件有把锁,mac文件被锁定怎么解决 mac解除文件锁定
  2. 批量解除文件锁定状态包含子文件夹
  3. 空洞卷积(扩张卷积dilated convolution)
  4. fdfs-文件上传信息返回详情
  5. 使用postman解决浏览器POST测试时登录问题:未登录无法进行POST提交
  6. 正弦积分与余弦积分函数
  7. 解决高并发(数据库锁机制)
  8. python打印10的负次方
  9. pdf转word转换器绿色版
  10. 车用总线技术 | 从另一种视角了解CAN FD