8-Bit over 7-Bit – Sonderzeichenmurks aus dem Mailfächle

tempa wrote this 04:51:

Viel Infos kommen im Postfach des Mailprogramms an und manchmal möchte man die Mails aus der Inbox oder einem der Unterordner in PHP weiter verwursten. Und 50 Jahre nach Gründung des Internets und des sehr regen internationalen Internetdatenverkehr scheint sich eine Vereinheitlichung der Datenformate noch immer etwas zu zieren. UTF-8 ist auf meinem alten Rechner nicht standard. Ich muss immer noch darauf achten, dass ich von ANSI auf utf-8 umstellen muss. Wenn ich bei der Verarbeitung auf Datensalad bei Sonderzeichen stoße, ist mein erster Gedanke UTF-8 zu ANSI Murks. Ich gehe also zu utf8_encode bzw. utf8_decode um den Zeichensalat aufzulösen. Pech gehabt!

Wenn Mail utf-8 ist, HTML charset utf-8 ist und das Script utf-8 ohne BOM gespeichert ist, könnte man verzweifeln. Den mit ut8_encode oder utf8_decode kommt man hier nicht weiter. Der Charset ist nicht das Problem, sondern der Faktor der ein Zeichen vom anderen trennt. Ein wahres Wunder also, dass nur die Sondezeichen betroffen sind. Der Umstieg von 7 Bit auf 8 Bit (Quoted Printable aus dem Mailkanal) findet man in der PHP-Doku unter den String-Funktionen (ohne Querverweis bei den Mailfunktionen): quoted_printable_decode

  1. $string = "=C3=84 =C3=96 =C3=9C, =C3=84=C3=96=C3=9C";
  2. echo quoted_printable_decode($string);
  3. /* Sonderzeichenausgabe: Ä Ö Ü, ÄÖÜ */

Dem DAU wird die Problemzuordnung in der Doku erschwert. Ist dort schließlich statt des Gleichheitszeichen „=“ das Prozentzeichen „%“ verwendet. Wäre ich kleiner PHP-Dau nicht über die RegEx-Syntax gestolpert und hätte im Forum php.de gefragt, hätte ich immer noch nicht das Problem korrekt identifiziert. Meine Lösung war ein preg_replace mittels Zeichen-Set im JSON-Objekt:

  1. $mails = file_get_contents("[Pfad zur Inbox]/1.eml");
  2. $chars = json_decode('{"Ä" : "=C3=84", "Ö" : "=C3=96","Ü" : "=C3=9C","ß" : "=C3=9F","ä" : "=C3=A4","ö" : "=C3=B6","ü" : "=C3=BC","EUR" : "=E2=82=AC"}');
  3. foreach ($chars as $key => $value){
  4. $mails = preg_replace(/$value/ , $key, $mails);
  5. }

Für dieses Problem zu umständlich (auch potentiell unvollständig), aber generell ein nettes, übersichtliches Script um mehrere Begriffe in einem Text auszutauschen und als solches nicht ganz für die Katz.

Leave a Reply