Tim Tepaße: Unicode: Erkennen der Kodierung anhand des BOMs

Beitrag lesen

Hallo Krebs,

Was ist die Kodierung des BOM FEFF unter dem Kodierungsschema UTF-8?

Das Byte-Order Mark ist dafür da, in einem Zeichenstrom die Reihenfolge der Bytes festzustellen. U+FEFF wird hier als Byte-Order Mark verwendet.

Wandeln wir mal U+FEFF in UTF-8 um:

Wir brauchen dafür laut UTF-8 drei Bytes, an die X-Stellen kommt unser Wert: 1110xxxx 10xxxxxx 10xxxxxx

0xFEFF ist 0b1111111011111111, wenn wir das dann in obiges Schema reinstopfen kriegen wir drei vollständige Bytes:

1110xxxx 10xxxxxx 10xxxxxx
    1111   111011   111111
11101111 10111011 10111111

0b111011111011101110111111 ist 0xEFBBBF, was sehr viel bequemer zu schreiben ist.

Überprüfen Sie, ob das Vorausschicken eines BOM ausreicht, um zwischen den bisher besprochenen Kodierungsschemata zu differenzieren.

Ich weiß nicht, was für Kodierungsschemata da schon vorher besprochen wurden, aber ich gehe einfach mal von UTF-8 und UTF-16 aus. Berechnen wir also mal die Bytes des BOMs in UTF-16:

0xFEFF ist in 0b1111111011111111, in Bytes 11111110 11111111

Wir zählen durch: Zwei Bytes, insgesamt 16 Bit. Wenn ich UTF-16 richtig verstehe, dann wird U+FEFF also genau so als 0xFEFF gespeichert.

Jetzt kommen wir wieder zur Reihenfolge der Bytes: U+FEFF ist natürlich nur dann in der Reihenfolge FE FF gespeichert (oder übertragen), wenn das System im Big Endian Modus arbeitet. Im Little Endian Modus ist es FF FE. U+FFFE wäre anscheinend niemals ein tatsächliches Zeichen in Unicode.

Wenn man jetzt also das Kodierungsschemata eines Bytestroms mit BOM vorne daran rausfinden will, guckt man sich einfach die ersten Bytes an:

EF BB BF  .. ist UTF-8.
FE FF     .. ist UTF-16 in Big Endian.
FF FE     .. ist UTF-16 in Little Endian, es empfiehlt sich also, die Bytes umzudrehen.

(Und was ist mit UTF-8 in Little Endian? So wie ich das verstehe, gibt es Little Endian in UTF-8 gar nicht, zudem wäre BF BB EF anscheinend gar kein richtiges UTF-8-Zeichen, meine ich. Aber das mögen Informiertere als ich erklären)

Tim