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 如何检查某文本为某编码方式的几率?

8 回复

对于判断文本编码的“几率”,没有绝对的概率值,但可以通过尝试解码和评估错误来间接判断。最直接的方法是使用 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 是不存在编码的问题的

回到顶部