Kalle_B: Zeichencodierung bestimmen

Hallöle,

mal wieder Ärger mit Umlauten und dem beta.

Ich möchte die Zeichencodierung einer hochgeladenen CSV- Datei bestimmen und versuche es mit mb_detect_encoding:

,'[feldinhalt]'      =>( mb_detect_encoding($arr_felder[$j])=="UTF-8" ) ? trim($arr_felder[$j]) : utf8_encode( trim($arr_felder[$j]) )
        ,'[encoding]'        =>  mb_detect_encoding($arr_felder[$j]).''

Also, wenn ein Wert bereits in UTF-8 codiert ist, soll er unverändert übernommen werden, sonst nach UTF-8 umsetzen. Zum Test ermittle ich noch, was mb_detect_encoding denn gefunden hat.

mb_detect_encoding erkennt den Wert Getr„nkeindustrie (so angezeigt in meinem Editor) nicht, gibt nichts an. Also wird umgesetzt nach UTF-8 und dann in HTML als Getr„nkeindustrie angezeigt.

Hier die in HTML angezeigten Zeichen und was sie sein sollen:
„ ä
” ö
� ü
á ß
™ Ö

Wie kann ich die Zeichencodierung herausfinden?

Gruß, Kalle

  1. mb_detect_encoding erkennt den Wert Getr„nkeindustrie (so angezeigt in meinem Editor) nicht

    Mit welcher Kodierung versucht dein Editor die Datei zu dekodieren? ISO-8859-1?

    Hier die in HTML angezeigten Zeichen und was sie sein sollen:
    „ ä
    ” ö
    � ü
    á ß
    ™ Ö

    Ich finde bei Wikipedia keine 8-bit-Kodierung, bei der an der Stelle 0xE4 das Zeichen „ steht.

    Auch die andere Zeichenentsprechungen zu ISO-8859-1 (ich nehme an, das meinst du damit) helfen mir nicht weiter.

    Ich behaupte mal, das ist keine anerkannte oder zumindest keine sonderlich verbreitete Kodierung. Vielleicht ist auch einfach irgendwo ein Fehler aufgetreten. Wie ist dein Editor konfiguriert?

    Mathias

    1. Wie ist dein Editor konfiguriert?

      Das verrät er nicht ;-)
      Es ist der Textpad 3.2.2 (1998). Leider hänge ich noch an ihm, weil GVIM sich weigert, UTF-8 zu können.

      Kalle

      1. @@Kalle_B:

        nuqneH

        »» Wie ist dein Editor konfiguriert?
        Das verrät er nicht ;-)

        Unter Konfiguration > Einstellungen > Dokumentenklasse > [bei entsprechender auf '+' clicken] > Schriftart > Skript verrät er’s. Jedenfalls Version 5.1.0 ...

        Es ist der Textpad 3.2.2 (1998). Leider hänge ich noch an ihm

        ... warum hängst du an der alten Version?

        weil GVIM sich weigert, UTF-8 zu können.

        Leider weigert sich TextPad, Unicode zu können. Das könnte ihn hier untauglich machen.

        Qapla'

        --
        Bildung lässt sich nicht downloaden. (Günther Jauch)
        1. Hallo, Gunnar,

          Unter Konfiguration > Einstellungen > Dokumentenklasse > [bei entsprechender auf '+' clicken] > Schriftart > Skript verrät er’s. Jedenfalls Version 5.1.0 ...

          Nöö, Dokumentenklasse gibt's da nicht (erst ab Version 4 gibt's bei HTML > Schriftart > Skript nur "westlich", das hatten wir noch gar nicht in der Diskussion).

          »» Es ist der Textpad 3.2.2 (1998). Leider hänge ich noch an ihm
          ... warum hängst du an der alten Version?

          Ich weiss nicht mehr, irgendwas hat mich gehindert, die vorhandene Version 4 zu nehmen. War das mal kostenpflichtig?

          »» weil GVIM sich weigert, UTF-8 zu können.

          Leider weigert sich TextPad, Unicode zu können. Das könnte ihn hier untauglich machen.

          Kennst du einen Editor, der UTF-8 kann?

          Kalle

          1. @@Kalle_B:

            nuqneH

            Ich weiss nicht mehr, irgendwas hat mich gehindert, die vorhandene Version 4 zu nehmen. War das mal kostenpflichtig?

            Ist TextPad 3 nach der Testphase kostenfrei?

            »» Leider weigert sich TextPad, Unicode zu können. Das könnte ihn hier untauglich machen.

            Kennst du einen Editor, der UTF-8 kann?

            TextPad kann UTF-8.

            Qapla'

            --
            Bildung lässt sich nicht downloaden. (Günther Jauch)
  2. echo $begrüßung;

    Wie kann ich die Zeichencodierung herausfinden?

    Es geht nicht. Prinzipiell geht es nicht. Ein Computer kann nicht wissen, was mit einem bestimmten Zahlencode für ein Zeichen gemeint ist, wenn er die Regeln nicht kennt. Man kann beispielsweise herausfinden, ob eine bestimmte Bytesequenz den Regeln der UTF-8-Kodierung entspricht. Man kann aber nicht ermitteln, ob der Autor tatsächlich UTF-8 gemeint hat. Vielleicht ergibt die Bytefolge nur zufällig gültiges UTF-8. Ob x nun u oder was ganz anderes sein soll, kann allenfalls der Mensch aus dem Kontext ermitteln, in dem das x steht. Maschinell ist das auch möglich, aber aufwendig, weil dazu eine Kenntnis der Sprache notwendig ist. Dann kann man mit einer gewissen Wahrscheinlichkeit sagen, für was das Zeichen stehen soll. Dieses Wissen lässt sich jedoch nicht einfach so in einer Funktion unterbringen. Und was macht mb_detect_encoding()? Zu viel versprechen. Das Vorliegen einer bestimmten Multibyte-Kodierung kann man in gewissen Grenzen anhand der Korrektheit der Bytesequenzen vermuten. Bei Einbyte-Kodierungen wie der ISO-8559-Familie ist das ausgeschlossen (ohne Sprachkenntnisse).

    Man kann die Rateversuche einschränken, wenn das System bekannt ist, auf dem der Text erstellt worden ist. Dann kann man anhand der dort üblicherweise verwendeten Kodierungen die Kandidaten einschränken. Als nächstes schaut man sich die Bytewerte der Zeichen an und vergleicht mit den Kodiertabellen der infrage kommenden Kodierungen ob sich etwas Sinnvolles ergibt. Je mehr solcher Übereinstimmungen gefunden werden, desto wahrscheinlicher ist das Vorliegen dieser Kodierung. Ein einziger Fehler jedoch wäre ein Ausschlusskriterium (oder eine Datenverfälschung).

    Das Einfachste ist immer noch die Kodierung zu kennen und gezielt umzukodieren.

    echo "$verabschiedung $name";

  3. Hallo,

    Ich möchte die Zeichencodierung einer hochgeladenen CSV- Datei bestimmen und versuche es mit mb_detect_encoding:

    diese Funktion kann leider auch nur anhand einiger Indizien raten.

    Getr„nkeindustrie
    „ ä
    ” ö
    ? ü
    á ß
    ™ Ö
    Wie kann ich die Zeichencodierung herausfinden?

    In diesem konkreten Fall hast du wohl Eingabedaten von irgendeinem DOS-basierten System in CP437.

    Dort hat das ä den Code 0x84, der in Windows-1252 wiederum als „ interpretiert wird. ö (0x94 in CP437) passt auf ”, ü (0x81) hat gar keine Entsprechung, ß (0xE1 in CP437) entspricht á, und Ö (0x99 in CP437) entspricht dem ™-Zeichen.
    Damit hast du diesen konkreten Fall gelöst. Eine allgemeine Lösung gibt's aber wohl nicht.

    Ciao,
     Martin

    --
    Mit einem freundlichen Wort und einer Waffe erreicht man mehr, als mit einem freundlichen Wort allein.
      (Al Capone, amerikanische Gangsterlegende)