有没有Python库函数可以猜测某些字节的字符编码?

20 投票
3 回答
14408 浏览
提问于 2025-04-11 09:34

我正在用Python写一些处理邮件的软件,但在邮件头字段中遇到了一些奇怪的字节。我怀疑这只是邮件格式不正确;邮件内容声称是用us-ascii编码的,所以我觉得并没有真正的编码。不过,我想得到一个接近原始内容的unicode字符串,而不想出现UnicodeDecodeError的错误。

所以,我在寻找一个函数,它可以接受一个str和一些可选的提示,然后尽力给我返回一个unicode。当然,我可以自己写一个,但如果已经有这样的函数,作者可能已经考虑过更好的实现方式。

我也知道Python的设计更倾向于明确而不是隐含,而且标准库的设计是为了避免在解码文本时出现隐含的魔法。我只是想明确地说“可以试着猜一下”。

3 个回答

2

我发现最好的办法就是一个一个尝试用常见的编码方式来解码,放在一个“尝试-捕获”的结构里。

28

赞同使用 chardet 这个模块。

它不在标准库里,但你可以用下面的命令很简单地安装它:

$ pip install chardet

这里有一个 示例

>>> import urllib.request
>>> rawdata = urllib.request.urlopen('http://yahoo.co.jp/').read()
>>> import chardet
>>> chardet.detect(rawdata)
{'encoding': 'EUC-JP', 'confidence': 0.99}

如果你还没有安装,可以查看 安装Pip 的方法。

16

根据我的了解,标准库里没有现成的函数,不过按照上面的建议,自己写一个也不算太难。我真正想要的是一种解码字符串的方法,并且能确保不会出现错误。字符串的decode方法中的错误参数正好可以做到这一点。

def decode(s, encodings=('ascii', 'utf8', 'latin1')):
    for encoding in encodings:
        try:
            return s.decode(encoding)
        except UnicodeDecodeError:
            pass
    return s.decode('ascii', 'ignore')

撰写回答