Oliver Kiehl wrote (Montag, 5. November 2001 16:20):
On Mon, Nov 05, 2001 at 03:41:11PM +0100, Thomas Hofer wrote:
Oliver Kiehl wrote (Montag, 5. November 2001 14:34):
sub mime_decode { $_ = shift; s/=\?iso-\d*-\d*\?(q|b)\?(.*)\?=/$2/gi && do { if ($1 eq 'q') { s/_/ /g; $_ = decode_qp($_); } else { $_ = MIME::Base64::decode($_); } }; # semicolon ist wichtig! return $_; }
ungetestet ;)
(immernoch)
Ihr solltet euch mal diese Testfälle zu Gemüte ziehen:
"=?ISO-8859-1?Q?kodiert1?=unkodiert=?ISO-8859-1?Q?kodiert2?="
"=?iso-8859-8?b?7eXs+SDv4SDp7Oj08A==?=unkodiert=?ISO-8859-1?Q?QPcod iert?="
beide muessten mit dem obigen Algorithmus funktionieren. Durch das s//g werden alle Instanzen in einer Zeile ersetzt.
Testfälle sind zum Testen da, nicht zum Wegdiskutieren. ;-) Das (.*)\?= schluckt zu viel. Es ist greedy und schnappt sich gleich mal alles bis zum _letzten_ "?=", nicht bis zum ersten, wie das eigentlich gedacht war. Mit einem Fragezeichen nach dem Stern kann man das aber beheben: (.*?)\= Das Problem in der zweiten Zeile bleibt aber bestehen: wenn im String sowohl base-64 als auch quoted-printable-codierung vorkommt, dann wird nur die letzt-verwendete codierung decodiert.
"10+10=20=?ISO-8859-1?Q?=20?=" Das Format ist übrigens in RFC-2047 definiert.
Was bedeutet '10+10=20'?
Nur eine mathematische Gleichung (ein Klartext also).
Ich habe jetzt keine Lust das RFC durchzulesen, aber wenn das der Klartext ist, duerfte das auch funktionieren.
"=20" ist ein Space in quoted printable Codierung. Wenn man die quoted-printable-decodierung auch über die Klartext-Teile laufen läßt, dann ist das zuviel des Guten. "10+10=20=?ISO-8859-1?Q?=20?=" --richtig--> "10+10=20 " "10+10=20=?ISO-8859-1?Q?=20?=" --falsch--> "10+10 " Thomas.