Hallo zusammen, On Mon, 05 Nov 2001, Oliver Kiehl wrote:
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 { [..] $_ = MIME::Base64::decode($_);
Das ist leider von vorherein (bei mir) schon flasch... Korrekterweise darf _nur_ der base64-kodierte Teil der Zeile an decode() uebergeben werden, s. unten wie man das loesen kann... [..]
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?QPcodiert?="
beide muessten mit dem obigen Algorithmus funktionieren.
Nein. Alle bisher genannten Algorithmen funktionieren nicht (immer). Ich habe jetzt nochmal recht ausfuehrlich getestet und habe eine Version, die nur noch an: Subject: Re: 7.3 =?iso-8859-1?Q?Stabilit=E4tsproble?= =?iso-8859-1?Q?me?= "scheitert", und ein "Stabilitätsproble me" draus macht, was ja auch korrekt ist, wenn das Mailprogramm das dieses Subject mailt mit Subject: Re: 7.3 =?iso-8859-1?Q?Stabilit=E4tsproble?= =?iso-8859-1?Q?me?= nicht so zurechtkommt, was mein neuer Algorithmus korrekt zu "Stabilitätsprobleme" dekodiert. Naja, durch solche "Fiesheiten" ist der code nicht mehr sonderlich "klein", aber mir faellt nix eleganteres ein. Ok, da ist ein Teil des codes doppelt, aber den zusammenzufassen wird umstaendlicher als ich jetzt Lust habe. Und bevor Fragen kommen: Nein, es geht _nicht_ einfacher (von der logik her), leider (z.B. wg. obigem Fall mit Umbruch im Wort und beide Teile einzeln kodiert. Ohne diese Verrenkungen waere der Algorithmus IMHO "elegant": ==== sub mime_decode_one_line_only { $_ = shift; if( s/=\?iso-\d*-\d*\?q\?(.*?)\?=/$1/gi) { $_ = decode_qp($_); s/_/ /g; } elsif( s/=\?iso-\d*-\d*\?b\?(.*?)\?=/decode_base64($1)/egi) { # nix ;) } return $_; } ==== Aber wie gesagt, das "greift" zu kurz... Also, diesmal recht ausfuehrlich anhand von suse-linux seit dem 1.11. getestet... HTH, -dnh PS: Ja, QP Strings im Body, wie frueher in diesem Thread werden korrekterweise _nicht_ dekodiert :))) ==== #!/usr/local/bin/perl -w use strict; use MIME::QuotedPrint; use MIME::Base64; sub mime_decode { my $line = shift; if( $line =~ s/=\?iso-\d*-\d*\?q\?(.*?)\?=/$1/gi) { $line = decode_qp($line); $line =~ s/_/ /g; my $next_line = (<>); if($next_line =~ /^[ \t]+.*=\?iso-\d*-\d*\?[qb]\?/i) { chomp($line); $next_line =~ s/^[ \t]+=\?/=?/; $next_line = mime_decode($next_line); } return "$line$next_line"; } elsif( $line =~ s/=\?iso-\d*-\d*\?b\?(.*?)\?=/decode_base64($1)/egi) { my $next_line = (<>); if($next_line =~ /^[ \t]+.*=\?iso-\d*-\d*\?[qb]\?/i) { chomp($line); $next_line =~ s/^[ \t]+=\?/=\?/; $next_line = mime_decode($next_line); } return "$line$next_line"; } else { return "$line"; } } my $maybe_next = 1; while(<>) { if(/^$/) { $maybe_next = 1; } if(/^From / && $maybe_next) { print "$_"; while(<>) { print mime_decode($_); last if(/^$/); } $maybe_next = 0; } else { print "$_"; } } ==== --
Wenn Du KDE 1 an ein vier- und KDE 2 an ein dreibeiniges Schwein bindest und beide gleichzeitig trittst, läuft KDE 1 schneller. F'up. Wenn du beide Schweine gleichzeitig trittst, landest du auf dem Hintern, und dann bleiben beide Schweine vor Lachen stehn ;-) [Robin S. Socha und André Schneider in dcoulm]