Die allwissende Müllhalde: explode() erzeugt Leerzeichen wo keine sein sollten!

Beitrag lesen

$datei = file($file);

for($x=0;$x<count($datei);$x++)

Nur als Tipp: Hier kannst Du auch

foreach ($datei as $zeile)

anwenden. Du sparst Dir damit die lästige Schreiberei der Indexvariablen beim Zugriff auf das Feld.

{
$parts = explode("|", $datei[$x]);

echo "$gid, $bid, $timestamp, $ip, $name, $kommentar <br>\n";

Ausgabe des Scripts:
ÿþ1, 3, 1 0 4 6 2 4 9 7 0 4, 8 0 . 1 4 5 . 1 2 2 . 1 7, t e s t, H

Die Datei ist im utf-16-Format gespeichert. utf-16 ist eine Speicherart für Unicode, bei der für jedes Zeichen 16 Bits, also zwei Byte verwendet werden. Das "ÿþ" am Anfang kennzeichnet hier (grob gesagt) die Unicode-Speicherung, die Leerzeichen entstehen dadurch, daß jedes Zeichen zwei statt wie seit Anno Dazumal üblich einem Byte einnimmt. Du bzw. So eine Datei muß man natürlich auch "Zwei-Byte-Weise" auslesen, nicht Ein-Byte-Weise, wie Du bzw. Dein PHP es gerade macht.

Es ist prinzipiell eine feine Sache, daß Du Unicode verwendest, weil Du Dir und Deiner Kundschaft damit viel Ärger ersparst. Mit herkömmlichen, 8-bittigen Zeichensätzen (8 Bit=256 Schriftzeichen) lassen sich nicht alle Schriftzeichen weltweit darstellen, selbst das Eurosymbol ist in vielen Zeichensätzen nicht vorhanden und in denen, in denen es vorhanden ist, liegt es an unterschiedlichen Positionen (Nummer 128 bei windows-1252, Nummer 164 bei iso-8859-15).
Unicode umfasst 32 Bit, das ist Raum für mehr als vier Milliarden Zeichen. Unicode wird von allen großen und kleinen Herstellern untersützt, Probleme mit inkompatiblen oder unzulänglichen Zeichensätzen werden in Zukunft also hoffentlich nicht mehr auftreten.

Aber zu Deinem Problem: Am einfachsten wäre es für Dich wahrscheinlich, den Dateiinhalt vor Weiterverarbeitung in einen herkömmlichen Zeichensatz zu konvertieren. PHP bietet dafür die iconv()-Funktion, siehe http://de.php.net/manual/de/function.iconv.php:

$datei = file("test.txt");
$datei[0] = substr($datei[0], 2); // utf-Markierungsbytes entfernen

foreach ($datei as $zeile) {
    $zeile = iconv("UTF-16","ISO-8859-1",$zeile);
    [...]
}

Bei "ISO-8859-1" muß der Zeichensatzname stehen, der von Dir benutzt wird. Verwendest Du in HTML (und indirekt auch in PHP) ausschließlich die &-Umschreibungen für Sonderzeichen (ü = ü usw.), kannst Du den allgemeinen Standard ISO-8859-1 stehen lassen, ansonsten kommt es auf Deinen Rechner und Texteditor an. Unter Windows wäre das beispielsweise windows-1252.

Abschließend stellt sich natürlich die Frage, wie Du überhaupt an diese utf-16-Datei gekommen bist? So üblich ist dieses Format nicht, normalerweise findet man utf-8 oder eben einen alten Zeichensatz wie iso-8859-x oder windows-1252.