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) kodiert. 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 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

Kodierunghexadezimale Darstellungdezimale DarstellungDarstellung nach Windows-1252
UTF-8EF BB BF[4]239 187 191
UTF-16 (BE)FE FF254 255þÿ
UTF-16 (LE)FF FE255 254ÿþ
UTF-32 (BE)00 00 FE FF0 0 254 255␀␀þÿ
UTF-32 (LE)FF FE 00 00255 254 0 0ÿþ␀␀
UTF-72B 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-1F7 64 4C247 100 76÷dL
UTF-EBCDICDD 73 66 73221 115 102 115Ýsfs
SCSU0E FE FF (von anderen möglichen
Bytefolgen wird abgeraten)[6]
14 254 255␎þÿ
BOCU-1FB EE 28 optional gefolgt von FF[7]251 238 40 optional gefolgt von 255ûî( optional gefolgt von ÿ
GB 1803084 31 95 33132 49 149 51„1•3

Siehe auch

Weblinks

Einzelnachweise

  1. Bug Database. Abgerufen am 21. März 2022.
  2. 33415 – Can’t compile .cpp file with UTF-8 BOM. Abgerufen am 21. März 2022.
  3. PHP :: Request #22108 :: php doesn’t ignore the utf-8 BOM. Abgerufen am 21. März 2022.
  4. RFC3629 – UTF-8, a transformation format of ISO 10646. November 2003, Abschnitt 6: Byte order mark (BOM). – Standard: [STD 63] (englisch).
  5. Nur die höchstwertigen 6 Bits des vierten Byte. Die untersten beiden Bits sind von dem nachfolgenden Zeichen bestimmt
  6. UTS #6: Compression Scheme for Unicode. Abgerufen am 21. März 2022.
  7. UTN #6: BOCU-1. Abgerufen am 21. März 2022.