Jörg: String auf codierung prüfen

Hi,

ich habe im Netz 2 Versionen gefunden, mit der ich einen String auf seine codierung prüfen können soll.

Anscheinend funktionieren beide nicht so recht?

  
// Returns true if $string is valid UTF-8 and false otherwise.  
function is_utf8($string) {  
  
    // From http://w3.org/International/questions/qa-forms-utf-8.html  
    return preg_match('%^(?:  
          [\x09\x0A\x0D\x20-\x7E]            # ASCII  
        | [\xC2-\xDF][\x80-\xBF]             # non-overlong 2-byte  
        |  \xE0[\xA0-\xBF][\x80-\xBF]        # excluding overlongs  
        | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}  # straight 3-byte  
        |  \xED[\x80-\x9F][\x80-\xBF]        # excluding surrogates  
        |  \xF0[\x90-\xBF][\x80-\xBF]{2}     # planes 1-3  
        | [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15  
        |  \xF4[\x80-\x8F][\x80-\xBF]{2}     # plane 16  
    )*$%xs', $string);  
  
} // function is_utf8  

Kann jemand bestätigen, dass diese Funktion sauber arbeitet?

Jörg

  1. hi,

    Kann jemand bestätigen, dass diese Funktion sauber arbeitet?

    Das nicht, aber ich kann Dir ein kleines Forumlar anbieten, womit Du die Zeichenkodierung in einer Datei prüfen kannst: UTF-8-Test

    Es unterscheidez zwischen utf-8, ascii und 8-bit(iso) Kodierung.

    Hotti

    1. Tach,

      Das nicht, aber ich kann Dir ein kleines Forumlar anbieten, womit Du die Zeichenkodierung in einer Datei prüfen kannst: UTF-8-Test

      Es unterscheidez zwischen utf-8, ascii und 8-bit(iso) Kodierung.

      wie MudGuard schreibt, kann man UTF-8 nicht zuverlässig erkennen (höchstens ausschließen) und so scheitert dein Test an einer ISO-kodierten Datei, die den Testtext von dedlfix enthält und benennt sie als UTF-8. Du solltest zumindest dazuschreiben, dass diese Erkennung zum Teil auf Raten basiert.

      mfg
      Woodfighter

      1. hi,

        wie MudGuard schreibt, kann man UTF-8 nicht zuverlässig erkennen (höchstens ausschließen) und so scheitert dein Test an einer ISO-kodierten Datei, die den Testtext von dedlfix enthält

        Sei mal sogut und schick mir die Datei (oder ein Hexmap).

        Vielen Dank,
        Hotti

        1. Hi!

          wie MudGuard schreibt, kann man UTF-8 nicht zuverlässig erkennen (höchstens ausschließen) und so scheitert dein Test an einer ISO-kodierten Datei, die den Testtext von dedlfix enthält
          Sei mal sogut und schick mir die Datei (oder ein Hexmap).

          Sei mal so gut und bring den folgenden Satz in eine Datei, die als ISO-8859-1 gespeichert wird:

          "Ein deutsches scharfes s, UTF-8-kodiert aber als ISO-8859-1 interpretiert sieht so aus: ß"

          Lo!

          1. hi,

            Sei mal so gut und bring den folgenden Satz in eine Datei, die als ISO-8859-1 gespeichert wird:

            "Ein deutsches scharfes s, UTF-8-kodiert aber als ISO-8859-1 interpretiert sieht so aus: ß"

            Haha, das sehe ich sofort, die Datei können wir uns sparen ;)

            Ja, danke Dir, alles klar, verstehe. Es gibt einige Bytefolgen, die aneinandergereiht auf die U-Schablone (Perl) passen, Beispiele (dezimal):

            212, 179, 213, 184

            203, 166, 216, 185

            200, 169, 196, 165

            In ISO sinds 4 Zeichen, in UTF-8 sinds dann 2. Schöne Worte sind das jedoch nicht und ein 'ß' als 'ß' auszusprechen bedarf eines geübten Blickes.

            Viele Grüße,
            Hotti

            PS, Sprich mal rückwärts:
              "Nebel bei Siebleben"

            (den Ort gibts tatsächlich, liegt in Thüringen, Vorort von Gotha)

            1. Hi!

              PS, Sprich mal rückwärts:
                "Nebel bei Siebleben"

              Hör dir mal Joseph Haydns Symphonie Nr. 47 in G-Dur rückwärts gespielt an.

              FG Ulysses

              1. hi,

                Hör dir mal Joseph Haydns Symphonie Nr. 47 in G-Dur rückwärts gespielt an.

                Palindrom im 3. Satz.

                War auch in der Rockmusik mal Mode...

                Hotti

                --
                Er nahm sie beim Händl, führte sie über die Heiden, an einem Bach vorbei und verbrahmste ihr eine mit List (Satz mit 5 Musikern).
          2. hi again,

            "Ein deutsches scharfes s, UTF-8-kodiert aber als ISO-8859-1 interpretiert sieht so aus: ß"

            Mit anderen Worten: Wenn die einzelnen Bytes zwischen 161 und 255 liegen, ist es auch möglich, dass die Zeichen ISO-kodiert sind. Das habe ich jetzt in mein Script eingebaut, weil ich vor ein paar Tagen vergessen hatte, auch daran zu denken.

            Danke Dir!!!!

            Hotti

      2. hi,

        wie MudGuard schreibt, kann man UTF-8 nicht zuverlässig erkennen (höchstens ausschließen) und so scheitert dein Test an einer ISO-kodierten Datei, die den Testtext von dedlfix enthält und benennt sie als UTF-8. Du solltest zumindest dazuschreiben, dass diese Erkennung zum Teil auf Raten basiert.

        Die Unterscheidung der Fälle:
           7 bit (ascii)
           8 bit (iso)
           mehr als 8 bit (utf8)
           gemischt (utf8 passt, iso passt auch)

        würde ich nicht als Raten bezeichnen. Das lässt sich exakt feststellen, wobei das natürlich vom Entwicklungsstand der Unicode-Unterstützung der jeweiligen Programmiersprache abhängt.

        Hotti

        1. Hi,

          7 bit (ascii)
             8 bit (iso)

          kann auch EBCDIC, Win1252, ... sein ...

          mehr als 8 bit (utf8)
             gemischt (utf8 passt, iso passt auch)

          Wie unterscheidest Du diese beiden Fälle?
          Jedes beliebige Byte ist ein gültiges EBCDIC-Zeichen oder Win1252-Zeichen oder ISO-8850-x Zeichen.

          cu,
          Andreas

          --
          Warum nennt sich Andreas hier MudGuard?
          O o ostern ...
          Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
        2. Hallo,

          Die Unterscheidung der Fälle:
             7 bit (ascii)
             8 bit (iso)
             mehr als 8 bit (utf8)
             gemischt (utf8 passt, iso passt auch)
          würde ich nicht als Raten bezeichnen.

          doch, schon - denn "mehr als 8 bit" hast du nicht. Du kriegst deinen Text immer als Folge von Bytes angeliefert.
          Sobald Werte im Bereich 0x80..FF dabei sind, kann es nicht mehr ASCII sein - aber sonst so ziemlich alles.

          Das lässt sich exakt feststellen

          Nein, wie dedlfix schon an einem Beispiel gezeigt hat.

          Ciao,
           Martin

          --
          Abraham sprach zu Bebraham: Kann i mal dei Cebra ham?
          Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        3. Tach,

          Die Unterscheidung der Fälle:
             7 bit (ascii)
             8 bit (iso)
             mehr als 8 bit (utf8)
             gemischt (utf8 passt, iso passt auch)

          würde ich nicht als Raten bezeichnen.

          Jeder gültige UTF-8-Text ist immer ein gültiger ISO-8859-*-Text, sobald du also ausgibst, dass ein Text UTF-8 ist, mußt du schon geraten haben, es ist nicht automatisch erkennbar. Der Umkehrschluß ist nicht zulässig, da z.B. auf ein Startbyte die passende Anzahl Folgebytes folgen müssen und z.B. die 13 höchsten Bytewerte nicht vorkommen können, kann man daran erkennen, dass ein Text nicht UTF-8 sein kann.

          mfg
          Woodfighter

  2. Hi!

    ich habe im Netz 2 Versionen gefunden, mit der ich einen String auf seine codierung prüfen können soll.

    "Auf seine Kodierung" ist zu allgemein formuliert. Die Funktion testet lediglich auf gültiges UTF-8. Ob allerdings wirklich UTF-8 gemeint ist, ist theoretisch nur durch eine Sinn-Analyse feststellbar. Praktisch werden wohl eher kaum die UTF-8-Byte-Sequenzen in "normalen" Texten vorkommen.

    "Ein deutsches scharfes s, UTF-8-kodiert aber als ISO-8859-1 interpretiert sieht so aus: ß"

    Dieser Satz ist gültiges UTF-8, ergibt aber nur als ISO-8859-1 interpretiert einen Sinn.

    Kann jemand bestätigen, dass diese Funktion sauber arbeitet?

    Sie sieht zumindest auf den ersten bis dritten Blick betrachtet richtig aus.

    Lo!

  3. Hi,

    ich habe im Netz 2 Versionen gefunden, mit der ich einen String auf seine codierung prüfen können soll.

    Aus einem Byte-Haufen sicher auf die Codierung zu prüfen ist nicht möglich.

    Man kann unter Umständen Codierungen ausschließen, aber genau festzustellen, welche Codierung es ist, ist nicht möglich.

    Ausschließen kann man z.B. US-ASCII, sobald ein Byte mit gesetztem höchsten Bit dabei ist.
    In UTF-8 ist auch nicht jede Byte-Folge erlaubt - tritt eine nicht-erlaubte Folge auf, kann's kein UTF-8 sein.

    In Codierungen wie EBCDIC, ISO-8859-x, Windows 1252 ist jedes Byte erlaubt - somit kann keine davon ausgeschlossen werden.

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
  4. Hi,

    solange dir das "Source-Encoding" nicht bekannt ist, kannst du das nicht prüfen. Das Ergebnis ist undefiniert aber kompatibel.

    LG