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 に答える