Cyx23: utf-8 und Einbinden verschiedener Quellen

Hallo,

bei meinen Suchen nach "file", "charset" und "encoding" konnte ich nichts
Passendes finden.

Ausgeliefert werden soll HTML in utf-8, vorher sollen Teile der späteren
HTML-Seite von ganz verschiedenen Systemen usw. hochgeladen werden können.

Gibt es Methoden solche Textblöcke -automatisch per PHP- verläßlich zu
analysieren (und dann ggf. zu konvertieren), oder wäre ein Umweg über eine
Formular-Eingabe der Texte sinnvoller?

Grüsse

Cyx23

  1. 你好 Cyx23,

    Gibt es Methoden solche Textblöcke -automatisch per PHP- verläßlich zu
    analysieren (und dann ggf. zu konvertieren), oder wäre ein Umweg über eine
    Formular-Eingabe der Texte sinnvoller?

    Nein, es gibt keine verlässliche Methode. Das einzige, was du prüfen kannst, ist, ob ein Text Zeichen enhält, die nicht in UTF-8 kodiert sind. Damit kannst du praktisch prüfen, ob der Text UTF-8-kodiert ist oder nicht.

    Aber es gibt keine Methode, herauszufinden, welches Encoding ein Text hat.

    再见,
     克里斯蒂安

    --
    Bauer sucht Frau! | Ich bin ja eigentlich kein Serien-Junkie…
    Kommt ein Nullvektor zum Psychiater: "Herr Doktor, ich bin orientierungslos!"
    http://wwwtech.de/
    1. Moin!

      Gibt es Methoden solche Textblöcke -automatisch per PHP- verläßlich zu
      analysieren (und dann ggf. zu konvertieren), oder wäre ein Umweg über eine
      Formular-Eingabe der Texte sinnvoller?

      Nein, es gibt keine verlässliche Methode. Das einzige, was du prüfen kannst, ist, ob ein Text Zeichen enhält, die nicht in UTF-8 kodiert sind. Damit kannst du praktisch prüfen, ob der Text UTF-8-kodiert ist oder nicht.

      Das ist sowas wie eine notwendige, aber keine hinreichende Bedingung. Wenn Bytes vorkommen, die laut UTF-8-Schema illegal sind, dann kann es kein UTF-8 sein. Das heißt für den umgekehrten Fall aber nicht, dass es dann in jedem Fall UTF-8 ist.

      Aber es gibt keine Methode, herauszufinden, welches Encoding ein Text hat.

      Man kann natürlich "raten": Ein Encoding ist in der Regel mit typischen Sprachen verbunden, die eine gewisse Zeichennutzung aufweisen. Diese Muster kann man natürlich analysieren, und wieder durch Ausschlußverfahren wegstreichen, welches Encoding es dann vermutlich nicht mehr ist.

      Das ist allerdings ziemlich "Magie". Als Anschauungsobjekt empfiehlt sich vielleicht, die Encoding-Rate-Routine des Firefox anzugucken. :)

      Oder eben die strikte Vorgehensweise, das Encoding von den externen Quellen entweder fixiert festgelegt einzukalkulieren (der Fall des Scheiterns muß dann aber eingeplant werden), oder die Quellen übermitteln dynamisch ihr gewähltes Encoding (HTTP-Header wären z.B. der klassische Fall).

      - Sven Rautenberg

      --
      "Love your nation - respect the others."
      1. 你好 Sven,

        Gibt es Methoden solche Textblöcke -automatisch per PHP- verläßlich zu
        analysieren (und dann ggf. zu konvertieren), oder wäre ein Umweg über eine
        Formular-Eingabe der Texte sinnvoller?

        Nein, es gibt keine verlässliche Methode. Das einzige, was du prüfen kannst, ist, ob ein Text Zeichen enhält, die nicht in UTF-8 kodiert sind. Damit kannst du praktisch prüfen, ob der Text UTF-8-kodiert ist oder nicht.

        Das ist sowas wie eine notwendige, aber keine hinreichende Bedingung. Wenn Bytes vorkommen, die laut UTF-8-Schema illegal sind, dann kann es kein UTF-8 sein. Das heißt für den umgekehrten Fall aber nicht, dass es dann in jedem Fall UTF-8 ist.

        Das ist richtig, theoretisch kann es auch eine andere Kodierung sein. Aber da in UTF-8 Zeichen > 7 Bit (also alles über 2^7) nur in einer bestimmten Kodierung vorkommen dürfen, ist es sehr, sehr unwahrscheinlich, dass ein Text in einer anderen Kodierung als UTF-8 nur legale Byte-Sequenzen enthält. Praktisch kann man also feststellen, ob der Text in UTF-8 kodiert ist oder nicht.

        再见,
         克里斯蒂安

        1. echo $begrüßung;

          Wenn Bytes vorkommen, die laut UTF-8-Schema illegal sind, dann kann es kein UTF-8 sein. Das heißt für den umgekehrten Fall aber nicht, dass es dann in jedem Fall UTF-8 ist.
          Das ist richtig, theoretisch kann es auch eine andere Kodierung sein. Aber da in UTF-8 Zeichen > 7 Bit (also alles über 2^7) nur in einer bestimmten Kodierung vorkommen dürfen, ist es sehr, sehr unwahrscheinlich, dass ein Text in einer anderen Kodierung als UTF-8 nur legale Byte-Sequenzen enthält. Praktisch kann man also feststellen, ob der Text in UTF-8 kodiert ist oder nicht.

          In diesem Forum beinahe täglich zu sehen sind Anfragen wie: "Meine Umlaute werden mir immer als ä angezeigt." Dies ist sowohl gültiges ISO-8859-1 als auch gültiges UTF-8 und obendrein noch ein praktischer Anwendungsfall, ist aber als UTF-8 interpretiert sinnentstellend.

          echo "$verabschiedung $name";

          1. 你好 dedlfix,

            In diesem Forum beinahe täglich zu sehen sind Anfragen wie: "Meine Umlaute werden mir immer als ä angezeigt." Dies ist sowohl gültiges ISO-8859-1 als auch gültiges UTF-8 und obendrein noch ein praktischer Anwendungsfall, ist aber als UTF-8 interpretiert sinnentstellend.

            Ja, das ist eines der Gegenbeispiele ;) Kommt aber so oft nicht vor.

            再见,
             克里斯蒂安

            --
            Bauer sucht Frau! | Ich bin ja eigentlich kein Serien-Junkie…
            Auf der ganzen Welt gibt es nichts Weicheres und Schwaecheres als Wasser. Doch in der Art, wie es dem Harten zusetzt, kommt nichts ihm gleich.
            http://wwwtech.de/
  2. Hallo,

    wäre ein Umweg über eine Formular-Eingabe der Texte sinnvoller?

    Ja! In dem Fall kannst du nämlich die Kodierung festlegen (accept-charset) bzw. durch einen Indikator herausfinden, welche Kodierung der Browser tatsächlich zur Kodierung der POST-Daten verwendet hat.

    Mathias

    1. Moin!

      wäre ein Umweg über eine Formular-Eingabe der Texte sinnvoller?

      Ja! In dem Fall kannst du nämlich die Kodierung festlegen (accept-charset)

      Naja, so halbwegs. Browserübergreifend funktioniert nur, an allen drei denkbaren Positionen (HTTP-Header, Meta-Element und Form-Attribut accept-charset) identisch UTF-8 anzugeben (jedes andere Encoding würde natürlich im Grundsatz auch funktionieren, aber bei nicht codierbaren Zeichen dann höchst unterschiedlich scheitern).

      bzw. durch einen Indikator herausfinden, welche Kodierung der Browser tatsächlich zur Kodierung der POST-Daten verwendet hat.

      Das ist nach meiner Erfahrung nur notwendig, wenn man befürchten muß, extrem kaputte Browser (also sehr alte Browser) in relevanter Anzahl unter den Nutzern vorzufinden, oder wenn man auf UTF-8 verzichten muß (einige Browser kommen auf die Idee, angeblich "kompatible", aber im Detail doch unterschiedliche Codierungen als Alternative zu dem Formularvorschlag zu verwenden - z.B. Windows 1252 anstelle von ISO-8859-1. Das macht u.a. Spaß beim Eurozeichen).

      Wenn man UTF-8 verwenden kann, sollte das in allen aktuellen Browsern (sogar noch den IEs der 5er-Reihe, aber natürlich nicht im Netscape 4) gut funktionieren.

      - Sven Rautenberg

      --
      "Love your nation - respect the others."
  3. Hallo,

    danke schonmal für die Rückmeldungen.

    Da scheint die Formular-Eingabe der sicherste Weg zu sein.

    Ansonsten überlege ich aber auch noch, ob es möglich ist durch einen immer
    stattfindenden umfassenden Zeichenaustausch der Quellen (ggf. auch die
    PHP-Möglichkeiten zur Konvertierung) alle Möglichkeiten abzudecken und zuletzt
    bei utf-8 anzukommen.

    Hier noch ein Ansatz zur Erkenung von utf-8:
    http://www.w3.org/International/questions/qa-forms-utf-8.en.php

    Und hier finden sich weiter unten wohl verschiedene Ideen zur Konvertierung:
    http://de3.php.net/manual/en/function.utf8-encode.php

    Da müßte ich wohl zuerst überlegen, was alles an Quellen möglich wäre, wenn
    mit verschiedener Software einfacher Text gespeichert wird, ASCII, *.txt,
    deutschsprachiger Raum, Windows, Mac, Linux. Oder würde so etwas viel zu
    umfangreich oder bei begrenzter Auswahl doch wieder zu riskant?

    Grüsse

    Cyx23

    1. Moin!

      Da scheint die Formular-Eingabe der sicherste Weg zu sein.

      Wenn es sich bei den Quellen um Erzeugnisse menschlicher Eingabetätigkeit handelt, dann ja. Textdateien beliebiger Encodingqualität sind ohne konkretes Tagging nicht sonderlich leicht zu behandeln.

      Viel besser sieht es aus, wenn man maschinelle Quellen anzapft - die tendieren nicht dazu, ihr Encoding überraschend zu wechseln, sondern konsistent immer das gleiche zu verwenden. Einmal drauf eingestellt, und fertig.

      Ansonsten überlege ich aber auch noch, ob es möglich ist durch einen immer
      stattfindenden umfassenden Zeichenaustausch der Quellen (ggf. auch die
      PHP-Möglichkeiten zur Konvertierung) alle Möglichkeiten abzudecken und zuletzt
      bei utf-8 anzukommen.

      Logisch, dass die Konvertierung nach UTF-8 stattfinden muß, anders kriegst du die beliebigen Encodings ja gar nicht gemischt. Wenn du das verwendete Encoding kennst, sollte dieser Schritt eigentlich auch problemlos funktionieren. PHP bietet z.B. ein Interface zur GNU Recode Bibliothek (wenn's allgemein bleiben soll) - und natürlich utf8_encode speziell für ISO-8859-1-Strings.

      Hier noch ein Ansatz zur Erkenung von utf-8:
      http://www.w3.org/International/questions/qa-forms-utf-8.en.php

      Das ist ja "nur" der Regex, um zu prüfen, ob die Annahme, ein String sei UTF-8-codiert, auch zutrifft.

      Da müßte ich wohl zuerst überlegen, was alles an Quellen möglich wäre, wenn
      mit verschiedener Software einfacher Text gespeichert wird, ASCII, *.txt,
      deutschsprachiger Raum, Windows, Mac, Linux. Oder würde so etwas viel zu
      umfangreich oder bei begrenzter Auswahl doch wieder zu riskant?

      Du hast im Prinzip immer dann Pech, wenn eine Datenquelle ihr Encoding nicht mitteilt. Und das ist in der Regel nur bei Textdateien der Fall. Formate wir Word haben ein bekanntes Encoding (kann man sicherlich irgendwo nachlesen), XML-Dateien sind zwar flexibel, aber erfordern die Encoding-Angabe im <?xml>-Header, sofern nicht UTF-8 verwendet wird.

      - Sven Rautenberg

      --
      "Love your nation - respect the others."
      1. Hallo Sven,

        PHP bietet z.B. ein Interface zur GNU Recode Bibliothek (wenn's allgemein bleiben soll)

        Nur als Hinweis: man will lieber iconv als recode verwenden, beides zusammen lässt sich nicht in PHP einkompilieren und iconv ist häufiger vorhanden als recode.

        Viele Grüße,
        Christian

        1. Moin!

          PHP bietet z.B. ein Interface zur GNU Recode Bibliothek (wenn's allgemein bleiben soll)

          Nur als Hinweis: man will lieber iconv als recode verwenden, beides zusammen lässt sich nicht in PHP einkompilieren und iconv ist häufiger vorhanden als recode.

          Sowas kommt davon, wenn man nur die Suche nach "encode" anwirft, und irgendwo klickt. :)

          - Sven Rautenberg

          --
          "Love your nation - respect the others."
  4. Hallo,

    noch ein utf-8 Problem.

    Wie sollte ein Mailversand eines utf-8 Textes erfolgen?

    Hier http://de2.php.net/manual/de/ref.mail.php finden sich Code-Beispiele wie:

    Content-Transfer-Encoding: 8bit

    Aber auch der Hinweis "you are not allowed to use 8-bit ASCII in mailheaders
    only 7-bit ASCII is allowed and pure utf-8 uses 8-bit ASCII" und das Beispiel:

      
    mail("xy@example.com", "=?UTF-8?B?".base64_encode("also öhm äähh ühh puh ja die Sonderzeichen")."?=", "asbdasdasd bla blabla", $headers);  
    
    

    Wie ist das idealerweise (für utf-8) zu kombinieren, bzw. wenn das Beispiel
    so geeignet ist, was sollte in $headers zum encoding stehen?

    Grüsse

    Cyx23