Byte Order Mark

aus Wikipedia, der freien Enzyklopädie
Wechseln zu: Navigation, Suche

Als Byte Order Mark (BOM; deutsch 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 in Skriptdateien der Shebang-Mechanismus verwendet, bei dem die Zeichenfolge "#!" ebenfalls am Dateianfang stehen muss. Steht hier ein unerwartetes BOM, gibt es Probleme. 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.

In Java wird beim Einlesen von UTF-8 Texten die Byte Order Mark nicht automatisch erkannt. Es ist Sache der Anwendungssoftware, das daraus generierte Zeichen 0xFEFF bei Bedarf zu entfernen.[3]

Bytefolgen der BOM in verschiedenen Zeichenkodierungen[Bearbeiten]

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öglichen Bytefolgen 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

Textkodierung bei UTF-16 in einem Hex-Editor:

4400 6900 6500 |D i e | = UTF-16LE / UCS-2LE
0044 0069 0065 | D i e| = UTF-16BE / UCS-2BE

Weblinks[Bearbeiten]

Einzelnachweise[Bearbeiten]

  1. http://bugs.php.net/bug.php?id=22108#c101624
  2. http://bugs.php.net/bug.php?id=22108#c80307
  3. http://bugs.sun.com/view_bug.do?bug_id=4508058
  4. STD 63: UTF-8, a transformation of ISO 10646 Byte Order Mark (BOM)
  5. Nur die höchstwertigen 6 Bits des vierten Byte. Die untersten beiden Bits sind von dem nachfolgenden Zeichen bestimmt
  6. UTS #6: Signature Byte Sequence for SCSU
  7. UTN #6: Signature Byte Sequence