6

これはばかげた質問かもしれませんが...ここに行きます!

ネイティブ C++ で独自の MIME パーサーを作成しました。エンコーディングの悪夢です!3ヶ月ほど安定していましたが、最近気付きましたSubject: header

Subject: =?UTF-8?B?T2ZpY2luYSBkZSBJbmZvcm1hY2nDs24sIEluaWNpYXRpdmFzIHkgUmVjbGFt?===?UTF-8?B?YWNpb25lcw==?=

これにデコードする必要があります:

Subject: Oficina de Información, Iniciativas y Reclamaciones

問題は= (equal)、そこに 1 つの余分なものがあり、2 つの(なぜ 2 なのか?)エンコードされた要素が分離されている理由がわかりません。理論的には、形式は : のはずです=?charset?encoding?encoded_string?=が、 two で始まる別の件名が見つかりました=

==?UTF-8?B?blahblahlblah?=

余分なものはどのように処理すればよい=ですか?

何かをする前に==?=? 私は)置き換えることができます(そしてそれは機能します) ...しかし、これに関する何らかの仕様があるかどうか疑問に思っているので、適切な機能にハックしません。

PS :これらの遺物プロトコルがどれだけ嫌いか! すべてのテキスト通信は UTF-8 と XML でなければなりません :)

4

3 に答える 3

2

MIME ヘッダーでは、エンコードされた単語が使用されます (RFC 2047 セクション 2.)。

... (なぜ 2 なのか?)

78行の長さの制限があるため、75のエンコードされた単語の制限を克服するため(または、たとえば中国語とポーランド語などの2つの異なるエンコーディングを使用するため)。

RFC2047:

「エンコードされた単語」は、「charset」、「encoding」、「encoded-text」、および区切り文字を含め、75 文字を超えてはなりません。75 文字の「エンコードされた単語」に収まるよりも多くのテキストをエンコードすることが望ましい場合は、複数の「エンコードされた単語 (CRLF SPACE で区切られた)」を使用できます。

RFC2047 の例を次に示します (間に「=」がないことに注意してください)。

Subject: =?ISO-8859-1?B?SWYgeW91IGNhbiByZWFkIHRoaXMgeW8=?=
  =?ISO-8859-2?B?dSB1bmRlcnN0YW5kIHRoZSBleGFtcGxlLg==?=

件名は次のようにデコードする必要があります。

"Oficina de Información, Iniciativas y Reclam=aciones"

mraq の回答が正しくありません。ソフト改行は、MIME 本文で使用できる 'Quoted Printable' Content-Transfer-Encoding にのみ適用されます。

于 2016-01-21T16:59:54.957 に答える
0

これは「ソフト ライン ブレーク」と呼ばれ、SMTP プロトコルの遺産です。

RFC2045の 20 ページを引用

(ソフト改行) Quoted-Printable エンコーディングでは、エンコードされた行の長さが 76 文字を超えないようにする必要があります。より長い行を Quoted-Printable エンコーディングでエンコードする場合は、「ソフト」な改行を使用する必要があります。エンコードされた行の最後の文字としての等号は、エンコードされたテキスト内のそのような意味のない (「ソフト」) 改行を示します。

また、Quoted-printable のウィキペディア

ソフト改行は、エンコードされた行の末尾にある「=」で構成され、デコードされたテキストでは改行として表示されません。

于 2014-03-14T12:47:05.867 に答える
0

MIME RFCでわかることから、二重の等号は有効な入力 (エンコード用) ではありませんが、最初の等号をそれが何であるかとして解釈し、次のものをデコードに使用できることに注意してください。しかし、深刻な問題として、これらの余分な等号はアーティファクトのように見えます。エンコーダが正しくない可能性があります。

于 2013-06-14T15:21:18.037 に答える