- Byte Order Mark
-
Als Byte Order Mark (BOM, dt. „Bytereihenfolge-Markierung“) wird das Unicode-Zeichen U+FEFF (englisch zero width non-breaking space) am Anfang eines Datenstroms bezeichnet, wo es als Kennung zur Definition der Byte-Reihenfolge und Kodierungsform in UCS/Unicode-Zeichenketten, insbesondere Textdateien, verwendet wird.
Bei den Kodierungen UTF-16 und UTF-32 muss die Byte-Reihenfolge angegeben werden, da die Zeichen jeweils mindestens entweder in 16 oder 32 Bit großen Werten kodiert sind und damit mehrere Bytes benötigen. Das Byte Order Mark kennzeichnet dabei, in welcher Reihenfolge die Bytes ausgewertet werden müssen. Diese Markierung wird immer dann besonders wichtig, wenn Daten zwischen unterschiedlichen Systemen ausgetauscht werden.
In UTF-16 besteht das BOM in Big-Endian-Notation aus der Zweibyte-Sequenz FE FF, in der Little-Endian-Notation umgekehrt aus FF FE. Da das Zeichen U+FFFE als ungültig definiert ist, kann durch die Reihenfolge der zwei Bytes eindeutig die Reihenfolge der Bytes festgestellt werden. Bei UTF-32 stehen davor oder dahinter noch zwei Nullbytes, die zur Erkennung der Byte-Reihenfolge dienen.
Die UTF-8-Kodierung des BOM besteht aus der Bytesequenz EF BB BF, die in nicht UTF-8-fähigen Texteditoren und Browsern meist als ISO-8859-1-Zeichen  erscheinen. Bei UTF-8 stellt sich das Problem der Byte-Reihenfolge zwar nicht, doch ein BOM am String- oder Dateianfang ist erlaubt, um die Verwendung von UTF-8 als Kodierung zu kennzeichnen. Eine sichere Unterscheidung zwischen UTF-8 und den ISO-8859-Zeichensätzen ist dadurch zwar nicht gewährleistet, da in den 8-Bit-Zeichensätzen alle Bytesequenzen erlaubt sind, auch die UTF-8-Kodierung des BOM; wenn aber die Alternative speziell UTF-8 oder ISO 8859-1 ist, ist die pragmatische Annahme, dass die Zeichenfolge  nicht gemeint ist, durchaus üblich.
Wird ein BOM verwendet, kann es jedoch auch zu Problemen mit Programmen kommen, die kein Byte Order Mark erwarten oder kennen. So wird in Unix-artigen Umgebungen oft die Shebang verwendet, welche ebenfalls am Dateianfang stehen muss. Auch melden Compiler wie z. B. gcc bei Verwendung eines BOM überschüssige Zeichen am Dateianfang, und in PHP vor Version 6[1] mit Standardeinstellungen[2] führt die BOM zur Ausgabe von Zeichen an den Browser, so dass ohne „output buffering“ keine HTTP-Header mehr geändert werden können.
Bytefolgen der BOM in verschiedenen Zeichenkodierungen
Kodierung hexadezimale Darstellung dezimale Darstellung Darstellung nach Windows-1252 UTF-8 EF BB BF
[3]239 187 191

UTF-16 (BE) FE FF
254 255
þÿ
UTF-16 (LE) FF FE
255 254
ÿþ
UTF-32 (BE) 00 00 FE FF
0 0 254 255
␀␀þÿ
UTF-32 (LE) FF FE 00 00
255 254 0 0
ÿþ␀␀
UTF-7 2B 2F 76
, und ein Zeichen aus:[ 38 | 39 | 2B | 2F ]
[4]43 47 118
, und ein Zeichen aus:[ 56 | 57 | 43 | 47 ]
+/v
, und ein Zeichen aus:8 9 + /
UTF-1 F7 64 4C
247 100 76
÷dL
UTF-EBCDIC DD 73 66 73
221 115 102 115
Ýsfs
SCSU 0E FE FF
14 254 255
␎þÿ
BOCU-1 FB EE 28
optional gefolgt vonFF
[5]251 238 40
optional gefolgt von255
ûî(
optional gefolgt vonÿ
GB 18030 84 31 95 33
132 49 149 51
„1•3
Weblinks
- The Unicode Standard, chapter 2.6 Encoding Schemes (englisch; PDF-Datei; 1,10 MB)
- The Unicode Standard, chapter 2.13 Special Characters and Noncharacters, section Byte Order Mark (BOM) (englisch; PDF-Datei; 1,10 MB)
- The Unicode Standard, chapter 16.8 Specials, section Byte Order Mark (BOM): U+FEFF (englisch; PDF-Datei; 415 kB)
- Unicode FAQ: UTF-8, UTF-16, UTF-32 & BOM (englisch)
Einzelnachweise
- ↑ http://bugs.php.net/bug.php?id=22108#c101624
- ↑ http://bugs.php.net/bug.php?id=22108#c80307
- ↑ STD 63: UTF-8, a transformation of ISO 10646 Byte Order Mark (BOM)
- ↑ Nur die höchstwertigen 6 Bits des vierten Byte. Die untersten beiden Bits sind von dem nachfolgenden Zeichen bestimmt
- ↑ UTN #6: Signature Byte Sequence
Wikimedia Foundation.