Byte Order Mark
Als Byte Order Mark (BOM; deutsch Byte-Reihenfolge-Markierung) wird eine charakteristische Bytefolge am Anfang eines Datenstroms bezeichnet, die das Unicode-Zeichen U+FEFF (englisch zero width no-break space) codiert. Diese Bytefolge dient als Kennung zur Definition der Byte-Reihenfolge und Kodierungsform in UCS/Unicode-Zeichenketten, insbesondere Textdateien.
In UTF-16 und UTF-32
Bei den Kodierungen UTF-16 und UTF-32 muss die Byte-Reihenfolge angegeben werden, da hier die einzelnen Zeichen jeweils mindestens in 16 oder 32 Bit großen Werten kodiert sind und damit mehrere Bytes benötigen (UTF-16: 2 Bytes, UTF-32: 4 Bytes). Das (auch: die) Byte Order Mark kennzeichnet dabei, in welcher Reihenfolge die Bytes auszuwerten sind. 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
.
In UTF-32 besteht das BOM
- in Big-Endian-Notation aus der Sequenz
00 00 FE FF
- in der Little-Endian-Notation aus
FF FE 00 00
.
Da das Zeichen U+FFFE jeweils als ungültig definiert ist, kann durch die Reihenfolge der ersten Bytes eindeutig die Auswertungs-Reihenfolge für alle folgenden Bytes festgestellt werden.
In UTF-8
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 durch die Verwendung eines BOM 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, dann ist die pragmatische Annahme durchaus üblich, dass die Zeichenfolge 
nicht gemeint ist, und daraus folgend, dass eine UTF-8-Kodierung vorliegt.
In Java wird beim Einlesen von UTF-8-Texten das Byte Order Mark nicht automatisch erkannt. Es ist Sache der Anwendungssoftware, das daraus generierte Zeichen 0xFEFF
bei Bedarf zu entfernen.[1]
Weiteres
Wird ein Byte Order Mark verwendet, so kann es zu Problemen mit Programmen kommen, die ein BOM nicht erwarten oder nicht kennen:
- in Unix-artigen Umgebungen wird in Skriptdateien oft der Shebang-Mechanismus verwendet, bei dem die Zeichenfolge „#!“ ebenfalls am Dateianfang stehen muss; steht hier stattdessen ein unerwartetes BOM, so gibt es Probleme.
- Compiler wie z. B. gcc (vor Version 4.4[2]) melden bei Verwendung eines BOM überschüssige Zeichen am Dateianfang
- in PHP mit Standardeinstellungen[3] führt das BOM zur Ausgabe von Zeichen an den Browser, so dass ohne „output buffering“ keine HTTP-Header mehr geändert werden können.
Tabellarische Übersicht
Kodierung | hexadezimale Darstellung | dezimale Darstellung | Darstellung nach Windows-1252 |
---|---|---|---|
UTF-8 | EF BB BF [4] |
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 ] [5] |
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 (von anderen möglichenBytefolgen wird abgeraten)[6] |
14 254 255 |
␎þÿ |
BOCU-1 | FB EE 28 optional gefolgt von FF [7] |
251 238 40 optional gefolgt von 255 |
ûî( optional gefolgt von ÿ |
GB 18030 | 84 31 95 33 |
132 49 149 51 |
„1•3 |
Siehe auch
Weblinks
- The Unicode Standard, chapter 2.6 Encoding Schemes (englisch, PDF, 1,10 MiB)
- The Unicode Standard, chapter 2.13 Special Characters and Noncharacters, section Byte Order Mark (BOM) (englisch, PDF, 1,10 MiB)
- The Unicode Standard, chapter 16.8 Specials, section Byte Order Mark (BOM): U+FEFF (englisch, PDF, 415 KiB)
- Unicode FAQ: UTF-8, UTF-16, UTF-32 & BOM (englisch)
Einzelnachweise
- http://bugs.sun.com/view_bug.do?bug_id=4508058
- https://gcc.gnu.org/bugzilla/show_bug.cgi?id=33415
- http://bugs.php.net/bug.php?id=22108#1067598726
- 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
- UTS #6: Signature Byte Sequence for SCSU
- UTN #6: Signature Byte Sequence