UTF-16

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

UTF-16 (englisch für Universal Multiple-Octet Coded Character Set (UCS) Transformation Format for 16 Planes of Group 00) ist eine Kodierung mit variabler Länge für Unicode-Zeichen. UTF-16 ist für die häufig gebrauchten Zeichen aus der Basic multilingual plane (BMP) optimiert. Es ist das älteste der Unicode-Kodierungsformate.

Allgemeines[Bearbeiten]

Bei der UTF-16-Kodierung wird jedem Unicode-Zeichen eine speziell kodierte Bytekette von zwei oder vier Byte Länge zugeordnet, so dass sich wie auch bei den anderen UTF-Formaten alle Unicode-Zeichen abbilden lassen.

Während UTF-8 eine zentrale Bedeutung in Internet-Protokollen hat, wird UTF-16 vielerorts zur internen Zeichenkettenrepräsentation verwendet, beispielsweise in aktuellen Versionen von Java.

Eigenschaften[Bearbeiten]

Aufgrund der Kodierung aller Zeichen der BMP in zwei Bytes hat die UTF-16-Kodierung den doppelten Platzbedarf im Vergleich zu UTF-8 oder geeigneten ISO-8859-Kodierungen bei Texten, welche hauptsächlich aus lateinischen Buchstaben bestehen. Werden jedoch viele BMP-Zeichen jenseits des Codepoints U+007F codiert, etwa chinesische, hat UTF-16 vergleichbaren oder weniger Platzbedarf.

Es besteht im Gegensatz zu UTF-8 keine Kodierungsreserve. Wird ein UTF-16-kodierter Text als ASCII interpretiert, sind lateinische Buchstaben zwar erkennbar, aber durch Null-Bytes getrennt.

Normung[Bearbeiten]

UTF-16 wird sowohl vom Unicode-Konsortium als auch von ISO/IEC 10646 definiert. Unicode definiert dabei zusätzliche Semantik. Ein genauer Vergleich findet sich im Anhang C des Unicode-4.0-Standards.[1] Die ISO-Norm definiert weiterhin eine Kodierung UCS-2, in der jedoch nur 16-Bit-Darstellungen der BMP zulässig sind.

Kodierung[Bearbeiten]

Die Zeichen der BMP werden direkt auf die 16 Bits einer UTF-16-Code-Unit abgebildet. Die BMP enthält die Unicode-Zeichen, deren Code im Bereich U+0000 bis U+FFFF liegt.

Unicode-Zeichen außerhalb der BMP (d. h. U+10000 bis U+10FFFF) werden durch zwei 16-Bit-Wörter (engl. code units) dargestellt, die wie folgt gebildet werden:

Von der Nummer des Zeichens wird zunächst die Zahl 65536 (10000hex) abgezogen (= Größe der BMP), wodurch eine 20-Bit-Zahl im Bereich von 00000hex bis FFFFFhex entsteht, die anschließend in zwei Blöcke zu je 10 Bit aufgeteilt und dem ersten Block die Bitfolge 110110, dem zweiten Block dagegen die Bitfolge 110111 vorangestellt wird. Das erste der beiden so entstandenen 16-Bit-Wörter bezeichnet man als High-Surrogate, das zweite als Low-Surrogate, und ihren Namen entsprechend enthält das High-Surrogate die 10 höherwertigen, das Low-Surrogate die 10 niederwertigen Bits des um 65536 verringerten ursprünglichen Zeichencodes. Der Codebereich von U+D800 bis U+DBFF (High-Surrogates) und der Unicode-Bereich von U+DC00 bis U+DFFF (Low-Surrogates) ist speziell für solche UTF-16-Ersatzzeichen reserviert und enthält daher keine eigenständigen Zeichen.

Bei der Umwandlung von UTF-16-Strings in UTF-8-Bytefolgen ist zu beachten, dass High- und Low-Surrogates (Ersatzzeichen) zunächst einmal wieder zu einem normalen Unicode-Zeichencode zusammengefasst werden müssen, bevor dieser dann in eine UTF-8-Bytefolge umgewandelt werden kann (Beispiel in der Beschreibung zu UTF-8). Da dies oft nicht beachtet wird, hat sich eine andere, inkompatible Kodierung für die Ersatzzeichen etabliert, die im Nachhinein als CESU-8 normiert worden ist.

Byte Order[Bearbeiten]

Je nachdem, welches der beiden Bytes zuerst übertragen bzw. gespeichert wird, spricht man von Big Endian (UTF-16BE) oder Little Endian (UTF-16LE).

Bei unzureichend spezifizierten Protokollen wird empfohlen, das Unicode-Zeichen U+FEFF (BOM, byte order mark), das für ein Leerzeichen mit Breite Null und ohne Zeilenumbruch (zero width no-break space) steht, an den Anfang des Datenstroms zu setzen – wird es als das ungültige Unicode-Zeichen U+FFFE (not a character) interpretiert, heißt das, dass die Byte-Reihenfolge zwischen Sender und Empfänger verschieden ist und die Bytes jedes 16-Bit-Worts beim Empfänger vertauscht werden müssen, um den sich anschließenden Datenstrom korrekt auszuwerten.

Beispiele[Bearbeiten]

In folgender Tabelle sind einige Kodierungsbeispiele für UTF-16 angegeben:

Beispiele für UTF-16 Kodierungen
Zeichen Unicode Unicode binär UTF-16BE binär UTF-16BE hexadezimal
Buchstabe y U+0079 00000000 01111001 00000000 01111001 00 79
Buchstabe ä U+00E4 00000000 11100100 00000000 11100100 00 E4
Eurozeichen U+20AC 00100000 10101100 00100000 10101100 20 AC
Violinschlüssel 𝄞 U+1D11E 00000001 11010001 00011110 11011000 00110100 11011101 00011110 D8 34 DD 1E
CJK-Ideogramm 𤽜 U+24F5C 00000010 01001111 01011100 11011000 01010011 11011111 01011100 D8 53 DF 5C

Die letzten beiden Beispiele liegen außerhalb der BMP. Da derzeit viele Schriftarten diese neuen Unicode-Bereiche noch nicht enthalten, können die dort enthaltenen Zeichen auf vielen Plattformen nicht korrekt dargestellt werden. Stattdessen wird ein Ersatzzeichen dargestellt, welches als Platzhalter dient. In den Beispielen wird durch die Subtraktion von 10000hex lediglich ein bzw. zwei Bits verändert (magenta) und aus den so entstandenen Bits die Surrogates gebildet.

Beispiel-Berechnung der Surrogates[Bearbeiten]

Für die Unicode-Position v

SG-Word1 = \tfrac{v-10000}{400} + D800
SG-Word2 = (v-10000)\;\bmod\;400 + DC00



v        = 0x64321
SG-Word1 = \tfrac{64321-10000}{400} + D800
         = 0xD950

SG-Word2 = (64321-10000)\;\bmod\;400 + DC00
         = 0xDF21

Einzelnachweise[Bearbeiten]

  1. Unicode 4.0, Anhang C (PDF; 155 kB)