4

如果我尝试在 python 2.6.5(和 2.7)中使用 decode_header() 解析这个字符串,我会得到一个 HeaderParseError。这里是字符串的 repr():

 '=?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
4

1 回答 1

1

用于 base64 编码字符串的 Python 字符集与邮件代理的字符集似乎不兼容:

>>> 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、AZ、az、+、/)。在同一篇文章中,包括了一些替代方案(包括这里的问题的下划线);但是,下划线的值是模糊的(它的值是 62 或 63,取决于替代方案)。

我不知道 Python 能做些什么来猜测 b0rken 邮件代理的意图;decode_header所以我建议你在失败时做一些适当的猜测。

我将邮件代理称为“损坏”,因为不需要转义+/在邮件标题中转义:它不是 URL,那么为什么不使用典型的字符集呢?

于 2011-07-25T08:28:28.957 回答