网站首页 > 开源技术 正文
对于人类能够识别的字符,计算机会根据某一对应关系将其转换为二进制形式进行保存。这个对应关系就是字符编码表,即什么样的字符对应什么样的二进制编码。这种字符编码表往往是多种多样的,因此,如果我们想要将一个未知编码的二进制文件转换为可读文本进行显示,就需要考其使用的是什么类型的字符编码。关于字符编码的进一步介绍见文章?字符集和字符编码??。
现实中,往往根据各种字符编码的特征字符来猜测当前文件使用的是什么类型的字符编码。但是许多字符对于不同字符编码是通用的,区别在于每种编码可能使用不同的字节序列来存储同一字符,根据这一特性再进一步处理。在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 UniversalDetector
usock = 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 UniversalDetector
texta = 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: break
detector.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 UnicodeDammit
data = bytes('你好世界,你好', encoding='GBK')
dammit = UnicodeDammit(data)
# 解码结果
print(dammit.unicode_markup)
# 打印编码结果
print(dammit.original_encoding)
# 或直接调用chardet
print(dammit.detector.chardet_encoding)
你好世界,你好
gb2312
GB2312
2 参考
- ??chardet??
- ??字符集和字符编码??
猜你喜欢
- 2024-10-25 爬虫犯法吗?| python爬虫小demo(爬虫违法?)
- 2024-10-25 还在为实习工作发愁?保姆级爬虫教程,python爬取“实习网”信息
- 2024-10-25 利用python爬虫,3分钟帮朋友找到工作
- 2024-10-25 用python实现自己的小说阅读器(python编写pdf阅读器)
- 2024-10-25 安卓手机基于python3搜索引擎(python调用安卓so文件)
- 2024-10-25 Pip, Pipenv, Poetry or Conda——你会选择哪个?
- 2024-10-25 手把手搭建Web蜜罐Glastopf(如何搭建蜜罐)
- 2024-10-25 Python实现一键翻译英文论文,实现了pdf文档英译汉,pdf格式不变
- 2024-10-25 zabbix 钉钉报警带监控波动图(zabbix实现钉钉报警)
- 2024-10-25 Python 3.8 稳定版正式发布,新特性全面解读
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- jdk (81)
- putty (66)
- rufus (78)
- 内网穿透 (89)
- okhttp (70)
- powertoys (74)
- windowsterminal (81)
- netcat (65)
- ghostscript (65)
- veracrypt (65)
- asp.netcore (70)
- wrk (67)
- aspose.words (80)
- itk (80)
- ajaxfileupload.js (66)
- sqlhelper (67)
- express.js (67)
- phpmailer (67)
- xjar (70)
- redisclient (78)
- wakeonlan (66)
- tinygo (85)
- startbbs (72)
- webftp (82)
- vsvim (79)
本文暂时没有评论,来添加一个吧(●'◡'●)