Python 如何检查某文本为某编码方式的几率?
伪代码如下:
s = '**************'
print(detectRisk(s,'gbk') #=>80% s 是 gbk 编码的概率是 80%
print(detectRisk(s,'utf8') #=>30% s 是 u8 编码的概率是 30%
请问 python 有没有这样的方法呢?
有 cchardet.dect(s)或者 chardet.dect(s),但都不能指定检查哪一种编码的概率。
Python 如何检查某文本为某编码方式的几率?
对于判断文本编码的“几率”,没有绝对的概率值,但可以通过尝试解码和评估错误来间接判断。最直接的方法是使用 chardet 库,它会返回一个置信度(confidence)分数,这可以理解为它认为编码正确的“几率”。
首先,安装 chardet:
pip install chardet
然后,使用以下代码检查:
import chardet
def detect_encoding_likelihood(text_bytes):
"""
检测字节串的编码及其置信度。
:param text_bytes: 字节串数据
:return: 编码名称和置信度(0-1之间)
"""
result = chardet.detect(text_bytes)
encoding = result['encoding']
confidence = result['confidence']
return encoding, confidence
# 示例:读取文件或接收到的字节数据
with open('your_file.txt', 'rb') as f:
raw_data = f.read()
encoding, confidence = detect_encoding_likelihood(raw_data)
print(f"检测到的编码: {encoding}, 置信度: {confidence:.2%}")
如果 chardet 无法满足需求(比如对特定编码的检测不够准确),可以手动尝试几种候选编码,通过捕获解码异常来判断:
def try_decode(text_bytes, candidate_encodings=['utf-8', 'gbk', 'iso-8859-1']):
for enc in candidate_encodings:
try:
decoded = text_bytes.decode(enc)
# 可以进一步通过字符分布等启发式方法评估
return enc, 1.0 # 假设解码成功即完全置信
except UnicodeDecodeError:
continue
return None, 0.0
encoding, confidence = try_decode(raw_data)
if encoding:
print(f"手动检测到的编码: {encoding}, 置信度: {confidence:.2%}")
else:
print("无法确定编码")
总结:用 chardet 的置信度作为“几率”参考,或手动尝试解码来评估。
chardet
{‘confidence’: 0.7525, ‘language’: ‘’, ‘encoding’: ‘utf-8’}
{‘confidence’: 1.0, ‘language’: ‘’, ‘encoding’: ‘ascii’}
{‘confidence’: 0.99, ‘language’: ‘’, ‘encoding’: ‘utf-8’}
{‘confidence’: 0.99, ‘language’: ‘’, ‘encoding’: ‘utf-8’}
chardet 不能指定检查哪种编码的概率。比如指定一段文本检查 gbk 编码的概率是多少。
那就自己实现喽。
In [1]: import chardet
In [2]: prober = chardet.utf8prober.UTF8Prober()
In [3]: prober.feed(‘你好,世界!’.encode(‘utf-8’))
Out[3]: 1
In [4]: prober.get_confidence()
Out[4]: 0.99
chardet 有出错的,而且速度很慢
s = ‘’, 貌似少个 b 吧,s = b’’。str 是不存在编码的问题的

