Was hat es mit der Kodierung und dem Byte Order Mark auf sich?
Damit ein Programm eine Datei korrekt verarbeiten kann, muss es die Kodierung kennen – ein Byte Order Mark stört dabei.
In unseren Breiten und besonders im Internet haben wir es zumeist mit der weit verbreiteten UTF-8 Zeichenkodierung zu tun. Diese Zeichenkodierung kann dabei sehr gut mit Sprachen der westlichen Welt umgehen.
Das Byte Order Mark ist dabei ein Zusatz zur eigentlichen Zeichenkodierung und kommt als erstes Zeichen in einem Dokument vor. Leider wird es von vielen Programmen nicht sehr gut gekennzeichnet. Wir wissen also nicht sofort, dass hier ein leeres Zeichen („U+FEFF“) am Beginn der Datei steht.
Was ist das Problem beim BOM?
Manche Programme können das Zeichen nicht korrekt verarbeiten, weil sie z.B. etwas anderes erwarten.
Und wenn nicht gefunden wird, was sich das Programm erwartet, kann das Programm die Datei nicht verarbeiten. Das passiert z.B. bei Bash-Skripten, die zwingend mit der Zeichenfolge „#!“ beginnen müssen. Wenn hier vor der Raute ein unsichtbares Leerzeichen steht, funktioniert das Skript nicht mehr.
Ähnlich schaut es bei PHP-Dateien aus, die auch mit einem „<?php“ beginnen. Wenn jetzt der Server versucht, so eine Datei zu verarbeiten, wird ein Leerzeichen gefunden und als Zeichen an den Client/Browser geschickt. Das führt dann zum vermutlich recht bekannten Fehler Cannot modify header information – headers already sent.
Wie kann ich herausfinden, ob es ein BOM in meiner Dateien gibt?
Dieser Fehler ist sehr ärgerlich, weil nicht sofort ersichtlich ist, warum er überhaupt auftritt.
Bei IDEs wie PHPStorm kann zum Auffinden eines BOMs erstmal die rechte untere Ecke genauer untersucht werden. Hier sollten diese zusätzlichen Informationen zur Datei angezeigt werden. Hier kann man entweder das BOM hinzufügen, oder entfernen.
Alternativ kann man auch im Terminal folgenden Befehl verwenden: grep -rl $'\xEF\xBB\xBF' .
Fehler beheben
So trivial wie der „Fehler“ auf den ersten Blick erscheint, die Behebung ist es nicht unbedingt.
Das Problem liegt hier in der Unsichtbarkeit dieses Zeichens.
- Öffnet die problematische Datei und begebt euch mit dem Cursor in die erste Zeile. Versucht dort mit den Backspace– und Entfernen-Tasten das BOM zu entfernen. Nur das öffnende „<?php“ zu löschen und neu zu schreiben, reicht nicht aus.
- Wenn ihr eine IDE oder einen hochwertigeren Editor verwendet, gibt es meist i-wo einen Ort, wo Meta-Infos zur Datei angezeigt werden. Dort kann meist auch die Kodierung der Datei angepasst werden.
- Verwendet im Terminal folgenden Befehl:
find . -type f -name '*.php' -exec sed -i '1s/^\xEF\xBB\xBF//' {} \;
// für Linuxfind . -type f -name '*.php' -exec sed -i '' -e '1s/^\xEF\xBB\xBF//' {} \;
// für MacOS- Dieser Befehl sucht alle Dateien mit Endung „.php“ und löscht dabei in der ersten Zeile das BOM