是否有Python库函数试图猜测某些字节的字符编码?

Nic*_*ick 15 python email invalid-characters character-encoding

我正在用Python编写一些邮件处理软件,它在头字段中遇到奇怪的字节.我怀疑这只是畸形邮件; 消息本身声称是us-ascii,所以我不认为有一个真正的编码,但我想得到一个unicode字符串近似原始的字符串而不抛出一个UnicodeDecodeError.

所以,我正在寻找一个功能,它需要一个str可选的一些提示,并且最好给我一个回复unicode.我当然可以写一个,但是如果存在这样一个函数,那么作者可能已经想到了更好的方法来解决这个问题.

我也知道Python的设计更喜欢显式到隐式,并且标准库旨在避免解码文本中的隐含魔法.我只想明确说"继续猜测".

jfs*_*jfs 24

chardet模块的+1 (建议@insin).

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

$ pip install chardet
Run Code Online (Sandbox Code Playgroud)

示例:

>>> 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'}
Run Code Online (Sandbox Code Playgroud)

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

  • 难道你不觉得“ISO-8859-2”是胡说八道吗? (2认同)

Jon*_*nan 21

您可能对Universal Encoding Detector感兴趣.


Nic*_*ick 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')
Run Code Online (Sandbox Code Playgroud)

  • 您可以跳过最后的“ascii”情况,只使用“latin1”,因为“latin1”将解码所有 256 字节值而不会出现错误。 (3认同)