BOM: Was ist ein Byte Order Mark?
Informationen, die über das Internet versendet werden, brauchen eine bestimmte Ordnung. Der Empfänger der Daten (zum Beispiel eine HTML-Seite) muss wissen, wie die Informationen zu lesen sind. Um das zu gewährleisten, fügt man verschiedene Markierungen in den Code ein. Eine solche Markierung ist das Byte Order Mark (BOM). Wofür ist der Marker gedacht?
Wozu braucht man das BOM?
Zeichen können auf unterschiedliche Art und Weisen codiert werden. Während man heutzutage vor allem UTF-8 verwendet, war früher die Kodierung mit UTF-16 populär – die auch heute oft noch genutzt wird. Teilweise verwendet man auch UTF-32. Anders als bei UTF-8 muss bei Kodierungen mit einer größeren Anzahl von Bits pro Zeichen jedoch die Reihenfolge der Bytes bekannt sein.
In einer UTF-8-Kodierung ist jedes Zeichen innerhalb von einem Byte (also 8 Bits) darstellbar. Bei UTF-16 benötigt man hingegen zwei Bytes (also 16 Bits) um ein Zeichen zu codieren. Damit sich das Zeichen also richtig interpretieren lässt, muss klar sein, ob die Bytes von links nach rechts oder von rechts nach links gelesen werden. Abhängig davon entsteht nämlich ein komplett anderer Wert.
- Von links nach rechts: 01101010 00110101 ist in hexadezimaler Schreibweise 6a35
- Von rechts nach links: 01101010 00110101 ist in hexadezimaler Schreibweise 356a
Würde man diese Ziffernfolge jetzt im Kontext einer Unicode-Tabelle sehen, würden zwei vollkommen unterschiedliche Zeichen dargestellt. Man spricht bei der ersten Lesart von Big Endian (BE), bei der zweiten von Little Endian (LE). Grund dafür ist, dass man beim Big Endian den höheren, beim Little Endian den niedrigeren Wert zuerst angibt.
Im Alltag ist uns die Notation nach Big Endian näher. Dabei handelt es sich aber nur um eine Konvention. Computer können mit beiden Speichermethoden umgehen, weshalb eine Markierung sinnvoll ist.
Um signalisieren zu können, in welcher Reihenfolge die Bytes zu lesen sind, benötigt man das BOM. Hierbei handelt es sich um ein Zeichen, das nicht sichtbar ist und deshalb auch als zero width no-break space bekannt ist. Es handelt sich also um ein Leerzeichen, das eine Breite von Null hat und keinen Zeilenumbruch auslöst. In UTF-16 ist dieses Zeichen (hexadezimal) entweder feff (BE) oder fffe (LE). Dieser Wert wird dann der eigentlichen Zeichencodierung vorangestellt.
UTF-8 benötigt das BOM eigentlich nicht – und dennoch findet man es auch in Texten, die damit kodiert wurden. Dabei handelt es sich entweder um ein Überbleibsel, das bei einer Konvertierung von UTF-16/UTF-32 zu UTF-8 entstanden ist, oder es ist durch einen Editor automatisch eingefügt worden. Denn auch, wenn das Byte Order Mark bei UTF-8 nicht notwendig ist, wirkt es im Regelfall auch nicht störend, da es nicht angezeigt wird.
Problemfall: Byte Order Mark
Zu Problemen kommt es dann, wenn das empfangende System nicht weiß, wie mit dem BOM umzugehen ist. Manche PHP-Versionen oder verschiedene Unix-artige Umgebungen rechnen nicht mit dem Zeichnen, was zum Beispiel zu einer fehlerhaften Darstellung einer Website führen kann.
Probleme können auch zwischen HTTP und HTML entstehen: Ein HTTP-Header beinhaltet von sich aus bereits Angaben zur Zeichenkodierung. Diese stammen aus den Servereinstellungen. Hat man das HTML-Dokument mit BOM erstellt, der HTTP-Header macht aber dem Browser gegenüber eine andere Angabe, kann das ebenfalls zu Darstellungsfehlern führen. Seit einer Änderung der HTML5-Spezifikation sollte dies aber nicht mehr auftreten: Dort wurde gefordert, dass das BOM am Anfang die Angaben des HTTP-Headers überschreibt. Es kann allerdings vorkommen, dass ältere Browserversionen diese Neuregelung noch nicht implementiert haben.
BOM entfernen – so geht’s!
Möchte man das Byte Order Mark aus einem Quelltext entfernen, benötigt man einen Texteditor, der das Speichern der Markierung als Option anbietet. Man liest die Datei mit BOM in die Software ein, speichert diese dann ohne BOM wieder ab und konvertiert damit die Kodierung. Die Markierung sollte dann nicht mehr auftauchen. Im beliebten Texteditor Notepad++ beispielsweise ändert man die Kodierung und kann die Datei dann ohne BOM abspeichern.
In älteren Versionen von Notepad++ findet man noch den Menüeintrag UTF-8 ohne BOM. In neueren Versionen entspricht dies der Angabe UTF-8. Mit Markierung wäre der Eintrag entsprechend UTF-8 BOM.