2013-06-13 4 views
6

Das könnte eine dumme Frage sein, aber ... hier geht es!Mime codierte Header mit extra '=' (==? Utf-8? B? Base64string? =)

Ich schrieb meinen eigenen MIME-Parser in nativem C++. Es ist ein Albtraum mit den Kodierungen! Es war stabil für die letzten 3 Monate oder so, aber kürzlich bemerkte ich diese Subject: header.

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

, die diese dekodieren sollte:

Subject: Oficina de Información, Iniciativas y Reclamaciones 

Das Problem gibt es eine zusätzliche = (equal) da drin ist, was ich nicht die beiden Bindung herausfinden kann (warum 2?) codierten Elemente, die Ich verstehe nicht, warum getrennt sind. In der Theorie sollte das Format: =?charset?encoding?encoded_string?= aber ein anderes Thema gefunden werden, das mit zwei = beginnt.

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

Wie soll ich übernehmen die zusätzlichen =?

I (und es funktioniert) ersetzen könnte ... aber ich frage mich, ob es irgendeine Art von Spezifikation bezüglich dieser so Hack ==? mit =?(was ich bin) vor etwas zu tun, ich weiß nicht mein Weg in die richtige Funktionalität.

PS: Wie sehr ich diese Reliktprotokolle hasse! Alle Textkommunikation sollte UTF-8 und XML sein :)

Antwort

2

In MIME-Headern werden codierte Wörter verwendet (RFC 2047 Abschnitt 2).

... (warum 2?)

75 Grenze codiertes Wort zu überwinden, die dort Länge wegen 78 Leitungsgrenze (oder verschiedene Kodierungen wie Chinesisch und Polnisch 2 zu verwenden, zum Beispiel) .

RFC 2047:

An 'codiertes Wort' nicht mehr als 75 Zeichen lang sein, einschließlich 'Zeichensatz', 'Codieren', 'codierter Text' und Trennzeichen. Wenn es wünschenswert ist, mehr Text zu codieren, als in ein 'codiertes Wort' mit 75 Zeichen passt, können mehrere 'codierte Wörter' (getrennt durch CRLF SPACE) verwendet werden.

Hier ist das Beispiel von RFC2047 (beachten Sie, es gibt keine '=' dazwischen):

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

sollte Ihr Thema als dekodiert werden:

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

mraq Antwort falsch ist . Weiche Zeilenumbrüche gelten nur für "Quoted Printable" Content-Transfer-Encoding, die im MIME-Body verwendet werden können.

0

Von dem, was ich in den MIME RFC doppelten Gleichheitszeichen sind nicht gültig Eingang (für die Codierung) sehen kann, aber im Kopf behalten kann man die ersten Gleichheitszeichen interpretieren als das, was Es ist und dann verwenden Sie die folgenden Dinge zum Decodieren. Aber im Ernst, diese zusätzlichen Gleichheitszeichen sehen wie Artefakte aus, vielleicht von einem falschen Kodierer.

+0

Ich denke schon. Ich habe sie in 5 E-Mails aus verschiedenen Quellen gesehen und dachte, dass es etwas ist, das mir fehlt. Und welchen besseren Ort zu fragen als SO): – CodeAngry

0

Es heißt "Soft Line Break" und es ist das Erbe des SMTP-Protokolls.

Zitiert Seite 20 von RFC2045

(Soft-Zeilenumbruch) In der angegebenen Druck-Codierung erfordert, dass codierte Zeilen nicht mehr als 76 Zeichen lang . Wenn längere Zeilen mit der Quoted-Printable-Codierung codiert werden sollen, müssen "weiche" Zeilenumbrüche verwendet werden. Ein Gleichheitszeichen wie das letzte Zeichen auf einer codierten Zeile zeigt einen solchen nicht signifikanten ("weichen") Zeilenumbruch im codierten Text an.

Und auch Wikipedia on Quoted-printable

Ein weicher Leitungsbruch besteht aus einem „=“ am Ende eines codiertes Zeile und als ein Leitungsbruch nicht in dem dekodierten Text erscheinen.

+2

Diese Antwort ist falsch. Es ist verwirrend 'Quoted Printable' Content-Transfer-Encoding (RFC 2045) mit 'Q-codierten' codierten Wörtern (RFC 2047). Das obige Thema sollte als "Oficina de Información, Iniciativas y Reclam = Aciones" dekodiert werden. –