MuschPusch: unbekannte dos codierung umwandeln mit php

Hallo,

ich habe eine geexportierte database als .txt und muss diese umwandeln in xml. Das Problem ist, wenn ich utf8_encode(); nutze werden bestimmte Zeichen gelöscht:
"`"
"´"
"€"

Wenn ich die txt unter windows öffne ist alles ok. Unter vim sehe ich <92> <91> <80> unter joe sind es wieder andere Zeichen. Mit einem simpelem str_replace wäre ich schon zufrieden aber wonach suchen?

gruß Volkan

  1. Moin!

    ich habe eine geexportierte database als .txt und muss diese umwandeln in xml. Das Problem ist, wenn ich utf8_encode(); nutze werden bestimmte Zeichen gelöscht:

    Das Problem ist, dass du eine unbekannte Zeichencodierung nicht umwandeln kannst, weil dir schlicht die Kodierungsvorschrift für "Welches Byte steht für welches Zeichen" fehlt.

    Finde heraus, welche Codierung verwendet wird - erst dann kannst du sinnvoll umwandeln. Und dann sinnvollerweise lieber mit iconv.

    "`"
    "´"
    "€"

    Wenn ich die txt unter windows öffne ist alles ok. Unter vim sehe ich <92> <91> <80> unter joe sind es wieder andere Zeichen. Mit einem simpelem str_replace wäre ich schon zufrieden aber wonach suchen?

    Sieht nach Windows-1252 aus, zumindest was die Position des Eurozeichens angeht. Ist aber inkompatibel zu ISO-8859-1, welches von utf8_encode() benutzt wird. Deshalb verschwinden die Zeichen.

    - Sven Rautenberg

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

      Finde heraus, welche Codierung verwendet wird - erst dann kannst du sinnvoll umwandeln. Und dann sinnvollerweise lieber mit iconv.

      iconv() wäre die Lösung. Leider habe ich durch telefonischen Kontakt nur die Info bekommen, dass es standard ascii ist... Das Wunder wird produziert durch eine Topspeed Database & Clarion. Weiss jemand welche iso die standard wegschreibt? Ich bin selbst auch auf der Suche aber noch nicht wirklich etwas gefunden. Gibt es andere Möglichkeiten um herauszufinden welche iso genutzt wird?

      Sieht nach Windows-1252 aus, zumindest was die Position des Eurozeichens angeht. Ist aber inkompatibel zu ISO-8859-1, welches von utf8_encode() benutzt wird. Deshalb verschwinden die Zeichen.

      nee leider nicht Windows-1252

      Gruß Volkan

      1. Moin!

        iconv() wäre die Lösung. Leider habe ich durch telefonischen Kontakt nur die Info bekommen, dass es standard ascii ist...

        Wenn es Standard-ASCII wäre, dürften Bytes größer als 127 gar nicht auftreten, denn ASCII definiert nur Zeichen von 0 - 127. Das kann also nicht sein.

        Es ist aber ein Armutszeugnis, dass keiner weiß, welche Zeichencodierung benutzt wird.

        Wenn die Info nicht durch verifizierte Quellen zu bekommen ist, bleibt nur die Methode, einen Testdatensatz anzufordern, in dem definierte Sonderzeichen enthalten sind, um anhand der resultierenden Bytes entweder das Codierungsschema herauszufinden, oder zumindest eine Transformationstabelle aufzustellen.

        Sieht nach Windows-1252 aus, zumindest was die Position des Eurozeichens angeht. Ist aber inkompatibel zu ISO-8859-1, welches von utf8_encode() benutzt wird. Deshalb verschwinden die Zeichen.

        nee leider nicht Windows-1252

        In iconv() wäre das "CP1252" - siehe Doku.

        - Sven Rautenberg

        --
        "Love your nation - respect the others."
        1. In VI den hex code suchen und dann:

          $str=str_replace(chr(hexdec(85)),"'", $str);
          [...]

          Es handelt sich um nicht so viele Zeichen... Dank euch beiden!

      2. echo $begrüßung;

        Gibt es andere Möglichkeiten um herauszufinden welche iso genutzt wird?

        Es ist wie bei jeder (dekodierbaren) Kodierung. Kennst du die Kodiervorschrift, kannst du das Kodierte lesen. Kennst du sie nicht, bleibt dir nur das Raten.
        Du kannst versuchen, diverse Kodiervorschriften darauf anzuwenden und schauen, ob das Ergebnis lesbar ist (z.B: Einladen der Datei in einen Browser und unter Ansicht -> (Zeichen)kodierung diverse Kodierungen durchprobieren).
        Du kannst die noch unbekannten Teile anhand des Kontexts entschlüsseln, und dann schauen, welche Kodierung dazu passt. Z.B. "K?se" - anstelle des ? steht ein Byte x84. Anhand des Kontext könnte man annehmen, dass es sich um ein ä handeln muss. ä = x84 => CP437 passt darauf. Man hat nun zumindest eine Kodierung, die es sein kann und viele, die es nicht mehr sein können. Passen die anderen Byte-Werte auch ins Bild, wird die Wahrscheinlichkeit, dass es CP437 ist immer größer.

        echo "$verabschiedung $name";