Python中的HeaderParseError
如果我在 Python 2.6.5(还有 2.7)中用 decode_header() 来解析这个字符串,就会出现一个叫做 HeaderParseError 的错误。下面是这个字符串的表示形式:
'=?iso-8859-1?B?QW5tZWxkdW5nIE5ldHphbnNjaGx1c3MgU_xkcmluZzNwLmpwZw==?='
这个字符串来自一封包含 JPEG 图片的 MIME 邮件。Thunderbird 可以解码这个文件名(文件名中有德语的变音符号)。
>>> from email.header import decode_header
>>> decode_header('=?iso-8859-1?B?QW5tZWxkdW5nIE5ldHphbnNjaGx1c3MgU_xkcmluZzNwLmpwZw==?=')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python2.6/email/header.py", line 101, in decode_header
raise HeaderParseError
email.errors.HeaderParseError
1 个回答
1
看起来Python在处理用base64编码的字符串时,和邮件程序之间有些不兼容的问题。
>>> from email.header import decode_header
>>> a='QW5tZWxkdW5nIE5ldHphbnNjaGx1c3MgU_xkcmluZzNwLmpwZw=='
>>> decode_header(a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/email/header.py", line 108, in decode_header
raise HeaderParseError
email.errors.HeaderParseError
>>> a1= a.replace('_', '/')
>>> decode_header(a1)
[('Anmeldung Netzanschluss S\xecdring3p.jpg', 'iso-8859-1')]
>>> print _[0][0].decode(_[0][1])
Anmeldung Netzanschluss Südring3p.jpg
Python使用的字符集是维基百科上提到的那种(也就是0-9,A-Z,a-z,+,/)。在同一篇文章中,还提到了一些替代字符(包括这里提到的下划线),但是下划线的具体值不太明确(它的值可能是62或63,这取决于具体的替代方案)。
我不知道Python该怎么猜测那些有问题的邮件程序的意图;所以我建议你在decode_header
失败的时候,适当进行一些猜测。
我称这个邮件程序为“有问题的”,因为在邮件头中其实没有必要对+
或/
进行转义:这不是一个网址,为什么不使用标准的字符集呢?