AllesMeins: Codierung einer XML Datei herausfinden und korrigieren

Hiho,

ich habe hier eine XML Datei erhalten, die per PHP importiert werden soll. Leider scheint diese Datei ungewöhnlich/fehlerhaft/sonstwie codiert zu sein, denn alle Sonderzeichen sind durch andere Zeichen ersetzt. So wird zum Beispiel ein kleines ä zu „, wo ein ü stehen sollte ist ein � usw.
Ist da beim erstellen der XMl Datei irgendwas falsch gelaufen? Ist die Anzeige meines (Windows-)Systems falsch? Und vor allem, wie bekomme ich mein PHP Scriot so hin, das die Sonderzeichen zumindest wieder richtig importiert werden, ohne jedesmal die Daie vorher per Hand neu zu bearbeiten müssen?
In dem Header der Datei steht der Zeichensatz sei "iso-8859-1".
Wo genau liegt hier der Fehler? Ist die Datei fehlerhaft erzeugt worden, wird sie nicht richtig angezeigt oder wie? Wie dem auch sei: Wichtig für mich ist vor allem wie bekomme ich sie beim einlesen wieder in ein richtiges Format?

Kann mir hier jemand helfen?

Grüße

Marc

  1. Hallo!

    Ist da beim erstellen der XMl Datei irgendwas falsch gelaufen?

    Sieht schwer danach aus!

    Und vor allem, wie bekomme ich mein PHP Scriot so hin, das die Sonderzeichen zumindest wieder richtig importiert werden, ohne jedesmal die Daie vorher per Hand neu zu bearbeiten müssen?

    Handarbeit!

    In dem Header der Datei steht der Zeichensatz sei "iso-8859-1".

    Ich denke wohl ehr im Prolog!

    Wo genau liegt hier der Fehler? WIst die Datei fehlerhaft erzeugt worden, wird sie nicht richtig angezeigt oder wie? Wie dem auch sei: Wichtig für mich ist vor allem wie bekomme ich sie beim einlesen wieder in ein richtiges Format?

    Ist Dir nicht bekannt wie sie erzeugt wurde?

    André Laugks

    --
    Die Frau geht, die Hilti bleibt!
    1. Hiho,

      Ist Dir nicht bekannt wie sie erzeugt wurde?

      Nein, leider nicht. Das Ding spuckt irgend ein komisches Programm aus, das irgendwann mal von irgend einer suspekten Firma (welche dummerweise nicht wirklich kooperativ ist) entwickelt wurde. Und jetzt sitze ich halt hier und soll damit was vernünftiges anfangen.

      Marc

      1. Hallo!

        Nein, leider nicht. [...]

        Hast Du mal eine Beispieldatei?

        André Laugks

        --
        Die Frau geht, die Hilti bleibt!
        1. Hiho,

          Hast Du mal eine Beispieldatei?

          Jein. Die Originaldatei darf ich leider nicht raus geben, aber ich hab mal aus den Originalproblemzeichen einen Beispieldatensatz gebaut. Hoffe mal das da durch nichts bedeutendes verloren gegangen ist, aber soweit ich das überblicke scheint hier alles richtig zu sein.
          http://www.startrek-bilder.de/spielplatz/beispiel.XML

          Grüsse

          Marc

          1. Moin,

            http://www.startrek-bilder.de/spielplatz/beispiel.XML

            Das Möchtegern-ü hast du zwar kaputt gemacht (das ist jetzt ein ganz normales Fragezeichen), aber aus dem ß schließe ich, bzw. Google, dass es sich um Codepage 437 handelt. Konvertierung in was ordentliches ist zum Beispiel mit
             recode IBM437/CR-LF..utf-8 < beispiel.XML
            möglich.

            (Mein Lösungsweg: http://www.google.de/search?q=E1+ß+-ss führt neben ziemlich viel Unfug auch zu http://www.ftsc.org/docs/fetch.php?doc=FSC-0051.003.)

            --
            Henryk Plötz
            Grüße aus Berlin
            ~~~~~~~~ Un-CDs, nein danke! http://www.heise.de/ct/cd-register/ ~~~~~~~~
            ~~ Help Microsoft fight software piracy: Give Linux to a friend today! ~~
  2. Hallo AllesMeins.

    ich habe hier eine XML Datei erhalten, die per PHP importiert werden soll. Leider scheint diese Datei ungewöhnlich/fehlerhaft/sonstwie codiert zu sein, denn alle Sonderzeichen sind durch andere Zeichen ersetzt. So wird zum Beispiel ein kleines ä zu „, wo ein ü stehen sollte ist ein � usw.

    Das deutet in der Tat auf eine inkorrekte Kodierungsangabe seitens deines Content-Type-Headers hin.

    In dem Header der Datei steht der Zeichensatz sei "iso-8859-1".

    Welcher? Der XML- oder der PHP-Datei?

    Wo genau liegt hier der Fehler? Ist die Datei fehlerhaft erzeugt worden, wird sie nicht richtig angezeigt oder wie? Wie dem auch sei: Wichtig für mich ist vor allem wie bekomme ich sie beim einlesen wieder in ein richtiges Format?

    Wenn du die Kodierung auslesen willst und dich nicht auf den BOM verlassen möchtest, wirst du wohl nichts ohne große Verrenkungen bewirken können.
    (Sollte die XML-Datei im UTF-8-Format vorliegen hilft auch [Wikipedia: UTF-8] für's Verständnis.)

    Einen schönen Mittwoch noch.

    Gruß, Ash*feel free*ura

    --
    Selfcode: sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:) fl:( ss:) ls:[ js:|
    30 Days to becoming an Opera8 Lover -- Keyboard Shortcuts
    Meine Browser: Opera 8.50 | Firefox 1.0.7 | Lynx 2.8.5 | Konqueror 3.3.2 | Netscape 4.7 | IE 6.0
    Use OpenOffice.org
    1. Hiho,

      Das deutet in der Tat auf eine inkorrekte Kodierungsangabe seitens deines Content-Type-Headers hin.

      Ich habe mit diesem Header recht wenig zu tun. Ich habe diese XML bekommen, sie auf gemacht, die Sonderzeichen gesehen und schon zum ersten mal gedacht: "Ok, das gibt Stress". Und wie erwartet zieht sich diese Sonderzeichenverkrüppelung dann auch durch alles was ich irgendwie mit dieser Datei machen könnte...

      Welcher? Der XML- oder der PHP-Datei?

      Von der XML Datei.

      Wenn du die Kodierung auslesen willst und dich nicht auf den BOM verlassen möchtest, wirst du wohl nichts ohne große Verrenkungen bewirken können.

      Eigentlich möchte ich nicht die Codierung auslesen, sondern einfach nur die Zeichen in die richtige Form bekommen. Da ich davon aus gehe das sich die Zeichencodierung der XML-Datei nicht so von selbst ändert reicht es mir auch die Codierung zu erraten. Eigentlich will ich nur die Sonderzeichen so haben, wie sie sein sollen :)

      Grüße

      Marc

      1. Hallo AllesMeins.

        Welcher? Der XML- oder der PHP-Datei?

        Von der XML Datei.

        Dann sollte dein Skript den dafür passenden Content-Type-Header senden.
        Eine Umwandlung in eine andere Kodierung ist nicht so einfach machbar.

        Eigentlich möchte ich nicht die Codierung auslesen, sondern einfach nur die Zeichen in die richtige Form bekommen. Da ich davon aus gehe das sich die Zeichencodierung der XML-Datei nicht so von selbst ändert reicht es mir auch die Codierung zu erraten. Eigentlich will ich nur die Sonderzeichen so haben, wie sie sein sollen :)

        Welche Kodierung verwendet dein PHP-Skript bei der Ausgabe?

        Einen schönen Mittwoch noch.

        Gruß, Ash*feel free*ura

        --
        Selfcode: sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:) fl:( ss:) ls:[ js:|
        30 Days to becoming an Opera8 Lover -- Keyboard Shortcuts
        Meine Browser: Opera 8.50 | Firefox 1.0.7 | Lynx 2.8.5 | Konqueror 3.3.2 | Netscape 4.7 | IE 6.0
        Use OpenOffice.org
        1. Hiho,

          beim einlesen verwende ich die Standardeinstellungend es XML-Parsers (das dürfte iso-8859-1 sein). Bei der Ausgabe ist leider gar nicht so einfach möglich, denn das ganze landet erst mal in ner Datenbank. Das Problem ist (denke ich) auch gar nicht so sehr die Ausgabe des PHP-Scriptes, denn die Sonderzeichen sind ja auch schon falsch wenn ich die XML direkt in einem texteditor öffne oder sie mir im Browser anzeigen lasse.

          Ich hab mal ne Beispieldatei erstellt. Siehe hierzu bitte meine kleinen Anmerkungen in dem Post:

          https://forum.selfhtml.org/?t=116805&m=747530

          Gr?áe (*g*)

          Marc

          1. Hallo AllesMeins.

            beim einlesen verwende ich die Standardeinstellungend es XML-Parsers (das dürfte iso-8859-1 sein).

            Dank deiner Angabe in der XML-Deklaration, ja. Ansonsten wäre UTF-8 Standard.

            Das Problem ist (denke ich) auch gar nicht so sehr die Ausgabe des PHP-Scriptes, denn die Sonderzeichen sind ja auch schon falsch wenn ich die XML direkt in einem texteditor öffne oder sie mir im Browser anzeigen lasse.

            Deswegen solltest du das Dokument korrekt kodiert speichern und alle Sonderzeichen korrigieren.

            Ich hab mal ne Beispieldatei erstellt. Siehe hierzu bitte meine kleinen Anmerkungen in dem Post:

            https://forum.selfhtml.org/?t=116805&m=747530

            Wie ich vermutete

            Gr?áe (*g*)

            Um es einmal mit Henryks Worten auszudrücken:
            I ❤ Unicode

            Einen schönen Donnerstag noch.

            Gruß, Ash*feel free*ura

            --
            Selfcode: sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:) fl:( ss:) ls:[ js:|
            30 Days to becoming an Opera8 Lover -- Keyboard Shortcuts
            Meine Browser: Opera 8.50 | Firefox 1.0.7 | Lynx 2.8.5 | Konqueror 3.3.2 | Netscape 4.7 | IE 6.0
            Use OpenOffice.org
            1. Hiho,

              Dank deiner Angabe in der XML-Deklaration, ja. Ansonsten wäre UTF-8 Standard.

              Jein, das hängt ziemlich von der PHP-Version ab ;)
              Aber es ist ja leider nicht meine Deklaration, sondern die stammt von diesem obskuren Programm, das auch die XML erzeugt. Und genau hier liegt das Problem. Ich gehe mal davon aus das dieses Ding auch in Zukunft die Dateien so zerhacken wird und meine Lust das regelmässig per Hand zu korrigieren hält sich in Grenzen.
              Deswegen brauch ich halt entweder ne Lösung mit der ich das automatisiert korrigieren kann oder aber nen "Beweis" das dieses XML-Erstell-Programm nicht korrigierbaren Mist baut.

              Grüße

              Marc

              1. Moin,

                Deswegen brauch ich halt entweder ne Lösung mit der ich das automatisiert korrigieren kann oder aber nen "Beweis" das dieses XML-Erstell-Programm nicht korrigierbaren Mist baut.

                Es erzeugt Mist. (Du darfst mich gerne zitieren ;-)
                Wenn auch korrigierbaren (sofern da kein Spaß dazu kommt). Lass mich raten, die Datenerfassung geschieht mit einem 20 Jahre alten DOS-Programm? Und als es an den Export ging, sagte die Firma "Ohh, _natürlich_ können wir XML. *indenbartgenuschelt: lassen sie mich nur schnell den formatstring hier ändern ...*".

                (Noch mehr unterstellte Zitate (das ist lustig): "Zeichencodierung? Nee, da brauchen sie sich keinen Kopf zu machen, wir verschlüsseln unsere Dateien nicht." "Nein, ich meine so Sachen wie UTF-8 ..." "nicht so einen Schweinkram hier!" "... latin-1 ..." "Latein? Keine Angst, wir sprechen hier alle Deutsch.")

                --
                Henryk Plötz
                Grüße aus Berlin
                ~~~~~~~~ Un-CDs, nein danke! http://www.heise.de/ct/cd-register/ ~~~~~~~~
                ~~ Help Microsoft fight software piracy: Give Linux to a friend today! ~~
                1. Hiho,

                  Lass mich raten, die Datenerfassung geschieht mit einem 20 Jahre alten DOS-Programm?

                  Ich hab (zum Glück) keine Ahnung was dahinter steckt. Und so genau will ich das auch gar nicht wissen, das würde mir wahrscheinlich nur meinen Glauben an die Menschheit rauben :)

                  Zu den Zitaten: Ich möchte fast unterschreiben, das das genau so abgelaufen ist.

                  Grüsse

                  Marc

  3. echo $begrüßung;

    Vielleicht hilft dir SELFHTML weiter, soll ganz gut sein, hab ich gehört ...

    Wo genau liegt hier der Fehler? Ist die Datei fehlerhaft erzeugt worden, wird sie nicht richtig angezeigt oder wie?

    Ist das vielleicht der Standardzeichensatz?

    Wie dem auch sei: Wichtig für mich ist vor allem wie bekomme ich sie beim einlesen wieder in ein richtiges Format?

    Vielleicht mit utf8_decode(). Oder mit iconv(). Oder mit  <xsl:output encoding=...>. Kommt ganz drauf an, womit/wie du "einliest" und welche Ziel-Zeichenkodierung es sein darf.

    echo "$verabschiedung $name";

  4. Hi,

    Wichtig für mich ist vor allem wie bekomme ich sie beim einlesen wieder in ein richtiges Format?

      
    /* Ist String korrektes UTF-8? */  
    function valid_utf8($string) {  
     $len=strlen($string);  
     $i=0;  
     while($i<$len) {  
      $char=ord($string{$i++});  
      if(valid_1byte($char)) { // continue  
       continue;  
      } elseif(valid_2byte($char)) { // check 1 byte  
       if(!valid_nextbyte(ord($string{$i++}))) return FALSE;  
      } elseif(valid_3byte($char)) { // check 2 bytes  
       if(!valid_nextbyte(ord($string{$i++}))) return FALSE;  
       if(!valid_nextbyte(ord($string{$i++}))) return FALSE;  
      } elseif(valid_4byte($char)) { // check 3 bytes  
       if(!valid_nextbyte(ord($string{$i++}))) return FALSE;  
       if(!valid_nextbyte(ord($string{$i++}))) return FALSE;  
       if(!valid_nextbyte(ord($string{$i++}))) return FALSE;  
      } else {  
       return FALSE; // 10xxxxxx occuring alone  
      } // goto next char  
     }  
     return TRUE; // done  
    }  
      
    function valid_1byte($char) {  
     if(!is_int($char)) return FALSE;  
     return ($char & 0x80)==0x00;  
    }  
      
    function valid_2byte($char) {  
     if(!is_int($char)) return FALSE;  
     return ($char & 0xE0)==0xC0;  
    }  
    function valid_3byte($char) {  
     if(!is_int($char)) return FALSE;  
     return ($char & 0xF0)==0xE0;  
    }  
    function valid_4byte($char) {  
     if(!is_int($char)) return FALSE;  
     return ($char & 0xF8)==0xF0;  
    }  
    function valid_nextbyte($char) {  
     if(!is_int($char)) return FALSE;  
     return ($char & 0xC0)==0x80;  
    }  
    
    

    Überprüfen und dann ggf. mit iconv() umwandeln.

    Gruß, Cybaer

    --
    Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
    1. Hallo Cybaer,

      sehr interessant. Aber was ist, wenn der String nur einzelne Fehler enthält, also im Ganzen utf-8 ist? iconv() konvertiert ja scheinbar nur von einem Zeichensatz in einen anderen.

      Konkret ist uns dieses Problem gerade bei der Zitatesammlung aufgetaucht, wenn man da ganz bestimmte "unsichtbare" Zeichen in das Formular eingibt, wird der utf-8 String in der XML-Datei fehlerhaft und der XML-Parser kann die Datei nicht mehr lesen. Also, utf-8 hin oder her, die XML-Datei ist nicht mehr wohlgeformt.

      Gruß, Andreas

      --
      SELFFORUM - hier werden Sie geholfen,
      auch in Fragen zu richtiges Deutsch
      1. Hi,

        sehr interessant. Aber was ist, wenn der String nur einzelne Fehler enthält,

        Ohne hellsehende Software (AC = Artificial Clairvoyance), dürfte es schwierig sein, (Tipp-)Fehler zu korrigieren. ;-)

        Konkret ist uns dieses Problem gerade bei der Zitatesammlung aufgetaucht, wenn man da ganz bestimmte "unsichtbare" Zeichen in das Formular eingibt, wird der utf-8 String in der XML-Datei fehlerhaft und der XML-Parser kann die Datei nicht mehr lesen. Also, utf-8 hin oder her, die XML-Datei ist nicht mehr wohlgeformt.

        Die unerlaubten Zeichen gleich bei der Form-Verarbeitung herausfiltern/anmeckern/dem Absender wieder vor die Hände schmeißen?

        Gruß, Cybaer

        --
        Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
        1. Die unerlaubten Zeichen gleich bei der Form-Verarbeitung herausfiltern/anmeckern/dem Absender wieder vor die Hände schmeißen?

          aber wie soll ich sie finden?
          Ich weiß gar nicht, um was für ein Zeichen es sich das handelt. Mal sehen, wie es hier aussieht: ¢Q

          Das sind 3 Zeichen, wovon eines im Textpad und Unired nicht darstellbar ist. DAS ist das Problemzeichen. Im Homesite wird es als Punkt dargestellt. Und das kommt in der XML-Datei auch als Geisterbyte an. Durch Deine Funktion kommt der String aber problemlos durch.

          Aha! die Vorschau sagt mir: "Sie haben ein Zeichen angegeben, das in XML- und SGML-Dokumenten verboten ist. Dazu gehören vor allem die Steuerzeichen aus dem ASCII-Bereich (ausser Zeilenumbruch, Zeilenvorschub und Tabulator). Das kann z.B. passieren, wenn Sie den Inhalt einer Binär-Datei posten möchten."

          Ein Lob auf dieses Forum!

          Wie kann ich denn jetzt diese Steuerzeichen im String mit PHP finden?

          Gruß, Andreas

          --
          SELFFORUM - hier werden Sie geholfen,
          auch in Fragen zu richtiges Deutsch
          1. Wie kann ich denn jetzt diese Steuerzeichen im String mit PHP finden?

            jo, hat sich schon erledigt, dank der schnellen Hilfe durch Christian Seiler. Und so gehts:

            if (preg_match("![\x00-\x08]|[\x0b-\x0c]|[\x0e-\x19]!", $daten))
            {
              // ungültiges Zeichen vorhanden
            }

            Gruß, Andreas

            --
            SELFFORUM - hier werden Sie geholfen,
            auch in Fragen zu richtiges Deutsch
    2. Hiho,

      ich bin leider immer noch etwas aufgeschmissen. Wenn irgend ein String durch das Prüf-Script "durchfällt" dann ist er kein UTF-8. Aber wie bekomme ich heraus was er wirklich ist bzw. was ich bei iconv als Quellzeichensatz angeben muss?

      Grüsse

      Marc

      1. Moin,

        ich bin leider immer noch etwas aufgeschmissen. Wenn irgend ein String durch das Prüf-Script "durchfällt" dann ist er kein UTF-8. Aber wie bekomme ich heraus was er wirklich ist bzw. was ich bei iconv als Quellzeichensatz angeben muss?

        Indem du die Person fragst von der du den String hast? Du hast grade herausgefunden, dass Nicht-ASCII-Strings ohne korrekte Angabe der Zeichencodierung weitgehend wertlos sind.

        (Diese Erkenntnis hat sich in der Computerbranche IMHO leider viel zu spät festgesetzt. Man hätte schon vor 15 oder 20 Jahren damit beginnen müssen, alle Interfaces über die eine Zeichenkette von einer Anwendung in eine andere kommen kann konsequent mit einer nicht-optionalen Zeichencodierungsangabe auszustatten.)

        Was dir bleibt sind höchstens noch (sprachraum- und betriebssystemspezifische) Heuristiken. Für Westeuropa und Windows zum Beispiel: Was nicht ASCII ist, ist vermutlich UTF-8. Was nicht UTF-8 ist, ist vermutlich ISO-8859-1(5). Was nicht ISO-8859-1(5) ist, ist vermutlich Windows-1252.
        (Parallel dazu: UTF-16 ist an der BOM leicht zu erkennen. Wenn Macs im Spiel sind, kann es statt ISO-8859-1(5) auch MacRoman sein.)

        Die Heuristik versagt natürlich sofort, wenn jemand anderes kommt. Etwa jemand der Tschechisch schreibt. Oder jemand mit DOS und Codepage 437 ;-)

        --
        Henryk Plötz
        Grüße aus Berlin
        ~~~~~~~~ Un-CDs, nein danke! http://www.heise.de/ct/cd-register/ ~~~~~~~~
        ~~ Help Microsoft fight software piracy: Give Linux to a friend today! ~~