volker: probleme beim einlesen von textfile

hallo zusammen,

ich habe hier ein seltsames verhalten: ich lese in einem php-script ein xml-file ein, parse das file und verarbeite es dann weiter.
nach dem lesen vom filesystem tauchen am anfang des files immer zwei sonderzeichen auf, nämlich (hex) FF und FE. dieses verhalten tritt immer auf, egal wie ich das file einlese. ich hab ausprobiert:

  • $sample = implode('',file('http://localhost/wc/sample_cc.xml'));

  • $sample = file_get_contents('http://localhost/wc/sample_cc.xml');

und sogar umständlich mit:
$handle = fopen("C:/WORK/htdocs/wc/sample_ls.xml", "r");
while (!feof($handle)) {
 $buffer = fgets($handle);
 $sample .= $buffer;
}
fclose($handle);

das ergebnis ist immer das gleiche: wenn ich die datei 'sample_cc.xml' im filesystem mit einem hex-editor öffne sieht alles gut aus, das erste zeichen ist 3C, das entspricht dem '<'. nach dem einlesen sind die ersten beiden zeichen FF und FE.

hat jemand eine ahnung was da schiefläuft?

gruss aus berlin, volker

  1. Hello,

    Sieht aus wie ein Verkettungs-Word. Der folgende Block ist FFFE bytes groß, dann folgt der nächste.

    Womit sind die Files denn erzeugt worden?

    Harzliche Grüße aus http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    1. Hello,

      Sieht aus wie ein Verkettungs-Word. Der folgende Block ist FFFE bytes groß, dann folgt der nächste.

      Womit sind die Files denn erzeugt worden?

      mit ultraedit. den inhalt der files habe ich per copy&paste aus einem pdf-dokument. aber das seltsame ist ja, dass die files im filesystem ok sind. die zusätzlichen bytes erscheinen erst nach dem einlesen. im script sieht das so aus:

      ...
      $sample = implode('',file('http://localhost/wc/sample_ls.xml'));
      echo $sample;
      ...

      der browser zeigt mir den inhalt korrekt an und erkennt das ganze auch als xml-dokument. wenn ich mit aber den quelltext im hex-modus anschaue erscheinen die beiden zusätzlichen bytes am anfang.
      bei dem ganzen gehts um online payment, deswegen ist der nachfolgende prozess welcher das xml-file verarbeitet extrem empfindlich, ansonsten hätte ich auch nie gemerkt dass die zusätzlichen zeichen da sind.

      gruss aus berlin, volker

  2. nach dem lesen vom filesystem tauchen am anfang des files immer zwei sonderzeichen auf, nämlich (hex) FF und FE. dieses verhalten tritt immer auf, egal wie ich das file einlese.

    hat jemand eine ahnung was da schiefläuft?

    Ich hab eine Ahnung.

    Das ist eine Unicode-Byteorder-Angabe (wie das genau heißt weiß ich nicht). Es sagt aus, je nachdem in welcher Reihenfolge die beiden Bytes stehen, ob die zwei Bytes der Unicode-Zeichen so herum oder andersrum in der Datei angeordnet sind.

    das ergebnis ist immer das gleiche: wenn ich die datei 'sample_cc.xml' im filesystem mit einem hex-editor öffne sieht alles gut aus, das erste zeichen ist 3C, das entspricht dem '<'. nach dem einlesen sind die ersten beiden zeichen FF und FE.

    Was kommt eigentlich nach dem 3C (<), ein 00 oder was anderes (z.B. das 3F für ein Fragezeichen (<?xml...))?

    Der von dir erwähnte Ultraedit ist in der Lage mit Unicode umgehen zu können. Dein Browser sicherlich auch. Achte mal im Ultraedit auf die Dateityp-Angabe in der Statuszeile (DOS/UNIX/U8-UNIX/...) und schau dir mal im Menu Datei die Optionen unter Konvertieren an. Außerdem gibt es in der Statuszeile eine Dateigrößen-Angabe. Wenn du ein Zeichen hinzufügst und dann speicherst, geht dann der Wert dort um 1 oder um 2 nach oben?

    1. hakllo dedlfix,

      Was kommt eigentlich nach dem 3C (<), ein 00 oder was anderes (z.B. das 3F für ein Fragezeichen (<?xml...))?

      in der tat, nach dem einlesen kommt ab position 3 nach jedem zeichen ein 00. aber wohlgemerkt, das alles passiert erst _nach_ dem einlesen des files in einen php-string. wenn ich das ursprüngliche xml-file mit ultraedit öffne finde ich weder die beiden sonderzeichen am anfang, noch die vielen '00' zwischen den einzelnen zeichen.

      auf jeden fall schonmal danke für den tip mit der unicode-byteorder-angabe, da werd ich mich mal weiter informieren.

      gruss aus berlin, volker

      1. Hello,

        in der tat, nach dem einlesen kommt ab position 3 nach jedem zeichen ein 00. aber wohlgemerkt, das alles passiert erst _nach_ dem einlesen des files in einen php-string. wenn ich das ursprüngliche xml-file mit ultraedit öffne finde ich weder die beiden sonderzeichen am anfang, noch die vielen '00' zwischen den einzelnen zeichen.

        Das solltest Du Dir auf jeden Fall als hexdump anschauen, bevor Du Deine Meinung bildest.

        Bei Editoren-Mix und File-In/File-Out erlebt man manchmal seine Überrschungen (so wie Du jetzt).

        Also immer versuchen, die Daten im RAW-Format (also NOT COOKED) zu visualisieren (z.B. mittels Hexcodierung 'anzuschauen').

        Harzliche Grüße aus http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        1. nur so als nachtrag: das ganze hat tatsächlich mit der angabe 'utf-8' zu tun, wenn ich die weglasse sind die sonderzeichen verschwunden. nur leider wird dann von der gegenseite mein request nicht verarbeitet...
          ich hab mein skript in die tonne geworfen und das ganze nochmal in perl gebaut, jetzt klappts. und schneller ist die geschichte so auch :-)

          gruss aus berlin, volker