我正在用Python编写一些邮件处理软件,它在标题字段中遇到奇怪的字节。我怀疑这只是畸形邮件;消息本身声称是us-ascii,所以我不认为有一个真正的编码,但我想得到一个unicode字符串近似原始字符串而不抛出UnicodeDecodeError
。
所以,我正在寻找一个函数,它接受str
和可选的一些提示,并且最好给我一个unicode
。我当然可以写一篇,但是如果存在这样一个函数,那么作者可能会想到更深入一点的最佳方法。
我也知道Python的设计更喜欢显式隐式,而标准库的设计是为了避免在解码文本时产生隐含的魔法。我只想明确说“继续猜测”。
答案 0 :(得分:24)
+1(由@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'}
如果您没有,请参见Installing Pip。
答案 1 :(得分:21)
您可能对Universal Encoding Detector感兴趣。
答案 2 :(得分: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')
答案 3 :(得分:0)
我发现这样做的最好方法是迭代尝试使用try除了块之外的每个最常见的编码来解码预期。