Hallo, Am Thu, 20 Nov 2003, Mathias Bauer schrieb:
Das =?iso-8859-1?q?= etc. habe ich nie genauer analysiert. Meist steht danach irgend ein Umlaut und manchmal heißt es statt -1 eben -15 etc.
Das ist eine Kodierung lt. RfC 1342, 1522, 2047. In Header duerfen _generell_ keine non-7-bit-ascii Zeichen auftreten, denn im Header ist das charset noch unbekannt, das wird ja dort erst im Content-Type-Header deklariert. Was macht man also? Man gibt das charset "inline" bei der Kodierung an. Die Form ist: encoded-word = "=?" charset "?" encoding "?" encoded-text "?=" Dabei duerfen im encoded-text _KEINE_ "?", Leerzeichen, Tabs oder Zeilenumbrueche stehen, diese sind lt. RfC in QP (Quoted Printable) als _ oder =20 zu mitzukodieren. Wird encoded-text mit Base64 kodiert, dann werden Leerzeichen automatisch mitkodiert. encoding kann Q oder B sein, fuer Quoted Printable oder Base64. Und: ==== RfC 2047 (3.) ==== The 'charset' portion of an 'encoded-word' specifies the character set associated with the unencoded text. A 'charset' can be any of the character set names allowed in an MIME "charset" parameter of a "text/plain" body part, or any character set name registered with IANA for use with the MIME text/plain content-type. ==== Es duerfen auch mehrerere, unterschiedlich kodierte Teile auftreten: ==== Re: Dateien nach Zeit =?iso-8859-15?B?bPZz?= =?iso-8859-15?Q?chen?= ==== Hierbei ist (wie immer) Whitespace am Zeilenende sowie am Zeilenanfang eines fortgesetzten Headers zu ignorieren. Ebenso zu ignorieren ist "whitespace" zwischen "ecoded-words": ==== RfC 2047 (6.2) ==== When displaying a particular header field that contains multiple 'encoded-word's, any 'linear-white-space' that separates a pair of adjacent 'encoded-word's is ignored. (This is to allow the use of multiple 'encoded-word's to represent long strings of unencoded text, without having to separate 'encoded-word's where spaces occur in the unencoded text.) ==== Leider gibt es viele MUAs, die das falsch machen, speziell im Zusammenhang mit fortgesetzten Headern fuegen diese dann gerne Whitespace innerhalb von encoded-words ein, oder verstuemmeln (v.a. Subjects), was dann zu so netten Sachen wie Subject: Re: Dateien nach Zeit =?iso-8859-15?B?PT9J?= =?iso-8859-15?Q?SO-8859-1=3FQ=3Fl=3DF6s?= l=F6schen?= fuehrt. Das dekodiert zu: Subject: Re: Dateien nach Zeit =?I SO-8859-1?Q?l=F6s l=F6schen?= Was, wenn man die falsche Fortsetzung und das falsche Leerzeichen korrigiert zu Subject: Re: Dateien nach Zeit =?ISO-8859-1?Q?l=F6s_l=F6schen?= wird, was wiederum zu Subject: Re: Dateien nach Zeit lös löschen dekodiert. Irgendein (tod)kranker MUA hat da also Mist gebaut.
Ich habe mir schon mal überlegt, ob man da mit recode was machen kann, oder ob man es gar mit sed das einfach wegoperiert, aber dann kommt sicher eine Email mit ganz exotischer (oder nicht konformer) Kodierung, welche man garantiert nicht berücksichtigt hat.
Ja, das geht mit recode, allerdings muss man vorher das encoding und das charset ausfiltern und die =????= wegmachen. Z.B.: ==== for x in $header # wortweise betrachten, s.o. do if echo "$x" grep -q '^=?' then charset="`echo \"$x\" | sed 's/.*=?\([^?]\+\)?.*/\1/'`" charset="`echo \"$charset\" | tr '[:lower:]' '[:upper:]'`" encoding="`echo \"$x\" | sed 's/.*=?[^?]\+?\([qQbB]\)?.*/\1/'`" encword="`echo \"$x\" | sed \ 's/.*=?[^?]\+?[qQbB]?\([^?]\+\)?=.*/\1/'`" case "$encoding" in q | Q) x="`echo \"$encword\" | sed 's/_/=20/g' | recode /QP..$charset`" ;; b | B) x="`echo \"$encword\" | recode /B64..$charset`" ;; esac fi echo -n " $x" done ==== "Defekte" wie oben angedeutet werden hier natuerlich nicht beruecksichtigt. In Perl laesst sich das etwas eleganter loesen, da kann man sogar manche Defekte reparieren. Bei Interesse kann ich meine Perl-Scriptfragmente mal ueberarbeiten (und moeglichst so, dass es sich mit perlcc (5.8.0) kompilieren laesst). -dnh -- - Macs sind für die, die nicht wissen wollen, warum Ihr Rechner funzt. - Linux ist für die, die wissen wollen, warum er funzt. - DOS ist für die, die wissen wollen, warum er nicht funzt, und - Windows ist für die, die nicht wissen wollen, warum er nicht funzt.