mixmastertobsi: PHP Codierungs Problem

Hallo,

ich habe ein Problem mit der PHP Codierung.

Ich habe ein Ticket-System programmiert und das PHP-Skript ruft automatisiert die eMails ab und verarbeitet diese. Nun sind leider die eMails immer unterschiedlich codiert und ich muss diese in eine einheitliche "Form" bringen.

Mit $sourceStr = mb_convert_encoding($sourceStr, "iso-8859-1"); klappt es zwar zu 90 %, aber es sind leider noch immer Mails dabei, bei welchen die Umlaute falsch ausgegeben werden.

Wenn ich statt $sourceStr = mb_convert_encoding($sourceStr, "iso-8859-1"); UTF8 $sourceStr = mb_convert_encoding($sourceStr, "UTF-8"); verwende, passen zwar die Umlaute bei den anderen Mails, aber bei anderen Mails bekomme ich wieder Probleme.

  1. Hey,

    Wenn ich statt $sourceStr = mb_convert_encoding($sourceStr, "iso-8859-1"); UTF8 $sourceStr = mb_convert_encoding($sourceStr, "UTF-8"); verwende, passen zwar die Umlaute bei den anderen Mails, aber bei anderen Mails bekomme ich wieder Probleme.

    Dann würde ich $sourceStr testen, ob die Umlaute korrekt umgewandelt wurden und wenn nicht $sourceStr durch das jeweils andere ersetzen. Sprich:

    $sourceStrTest = mb_convert_encoding($sourceStr, "iso-8859-1");
    
    if (strpos($sourceStrTest, "...") !== -1 || strpos($sourceStrTest, "...") !== -1) {
    $sourceStr = mb_convert_encoding($sourceStr, "UTF-8");
    } else {
    $sourceStr = $sourceStrTest;
    }
    

    Für die Punkte dann den aufkommenden String eines Umlauts einsetzen. (Aber bin mir nicht ganz sicher ob strpos -1 zurückgibt, wenn der gesuchte String nicht im zu durchsuchendem String ist.)

    Gruß
    Jo

  2. Tach!

    Nun sind leider die eMails immer unterschiedlich codiert und ich muss diese in eine einheitliche "Form" bringen.

    Möglichkeit 1: Den entsprechenden Header der Mail auslesen, dann weißt du, in welcher Kodierung die Mail daherkommt. Zumindest in der Theorie. Einige kaputte Clients können auch eine Angabe setzen, die nicht zur tatsächlich verwendeten Kodierung passt. Gefühlt sind das jedoch meist Mails, deren Inhalt man sowieso nicht haben möchte.

    Möglichkeit 2: Du ignorierst den Header und prüfst stattdessen, ob die Mail gültiges UTF-8 ist. Alle Bytes größer als 7F müssen in einem bestimmten Format daherkommen (siehe beispielsweise Wikipedia zu UTF-8). Hast du ungültige Sequenzen in der Mail, dann wird es wohl kein UTF-8 sein. In Ausnahmefällen liefert dieser Test aber auch False-Positives. Wenn es kein gültiges UTF-8 ist, sondern eine aus der ISO-8859-Familie, dann hast du schlechte Karten, weil man diese kaum ohne Intelligenz oder Wörterbuchtests diverser Sprachen erraten kann. Du kannst dann praktischerweise lediglich von UTF-8 und Nicht-UTF-8 ausgehen und letzeres als ISO-8859-1 annehmen. Mit vermutlich recht geringer Restfehlerquote, solange du nur Mails aus deutschsprachigen oder westeuropäischen Gegenden erwartest.

    dedlfix.

    1. Hello,

      zusätzlich zu dedlfix:

      @mixmastertobsi:
      der richtige Weg ist es, die Header und Prefixe auszuwerten, so wie ein eMail-Client das auch tun würde.

      Wenn Du mal (im WEb) suchst nach "is_utf8" und/oder "seems_utf8" solltest Du Funktionen finden, die zumindest das Erkennen einer UTF-8-Kodierung mit einer hohen Wahrscheinlichkeit ermöglichen. Schwund ist aber überall ;-)

      Wenn Du Einfluss auf das System hast, würde ich die eMail immer noch als *.eml-Datei hinterlegen und dem Ticket-Bearbeiter ermöglichen, die mit seinem richtig eingerichteten (!) eMail-Client aufzurufen.

      Alternativ kannst Du dem Bearbeiter auch pro Feld (Header: from, subject; Body) die Möglichkeit per Button einräumen, die Codierung umzustellen.

      Liebe Grüße
      Tom S.

      --
      Es gibt nichts Gutes, außer man tut es!
      Das Leben selbst ist der Sinn.