18

我正在用 Python 编写一些邮件处理软件,在标头字段中遇到奇怪的字节。我怀疑这只是格式错误的邮件;消息本身声称是 us-ascii,所以我认为没有真正的编码,但我想在不抛出UnicodeDecodeError.

所以,我正在寻找一个函数,它需要 astr和可选的一些提示,并尽最大努力给我一个unicode. 我当然可以写一个,但如果存在这样的函数,它的作者可能已经更深入地考虑了解决这个问题的最佳方法。

我也知道 Python 的设计更喜欢显式而不是隐式,并且标准库旨在避免在解码文本时使用隐式魔法。我只想明确地说“继续猜测”。

4

3 回答 3

27

+1 用于chardet模块(由 建议@insin)。

它不在标准库中,但您可以使用以下命令轻松安装它:

$ pip install chardet

示例

>>> import chardet
>>> import urllib
>>> detect = lambda url: chardet.detect(urllib.urlopen(url).read())
>>> detect('http://stackoverflow.com')
{'confidence': 0.85663169917190185, 'encoding': 'ISO-8859-2'}    
>>> detect('https://stackoverflow.com/questions/269060/is-there-a-python-lib')
{'confidence': 0.98999999999999999, 'encoding': 'utf-8'}

如果没有,请参阅安装 Pip 。

于 2008-11-06T16:13:29.367 回答
14

据我所知,标准库没有函数,尽管按照上面的建议编写一个函数并不难。我认为我正在寻找的真正东西是一种解码字符串并保证它不会引发异常的方法。string.decode 的 errors 参数就是这样做的。

def decode(s, encodings=('ascii', 'utf8', 'latin1')):
    for encoding in encodings:
        try:
            return s.decode(encoding)
        except UnicodeDecodeError:
            pass
    return s.decode('ascii', 'ignore')
于 2008-11-07T21:03:20.330 回答
1

我发现做到这一点的最好方法是迭代地尝试使用 try except 块内的每个最常见的编码来解码预期。

于 2008-11-07T02:31:26.907 回答