UTF-16

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springenZur Suche springen

UTF-16 (englisch fürUniversal Multiple-Octet Coded Character Set (UCS)TransformationFormat for16 Planes of Group 00) ist eineKodierung mitvariabler Länge fürUnicode-Zeichen. UTF-16 ist optimiert für die häufig gebrauchten Zeichen aus derBasic multilingual plane (BMP). Es ist das älteste derUnicode-Kodierungsformate.

Inhaltsverzeichnis

Allgemeines

[Bearbeiten |Quelltext bearbeiten]

Bei der UTF-16-Kodierung wird jedem Unicode-Codepunkt eine speziell kodierte Kette von ein oder zwei 16-Bit-Einheiten zugeordnet, d. h. von zwei oder vierBytes, so dass sich – wie auch bei den anderenUTF-Formaten – alle Unicode-Zeichen abbilden lassen.

WährendUTF-8 eine zentrale Bedeutung inInternet-Protokollen hat, wird UTF-16 vielerorts zur internen Repräsentation vonZeichenketten verwendet, z. B. in aktuellen Versionen von.Net-Framework,Java undTcl.

Eigenschaften

[Bearbeiten |Quelltext bearbeiten]

Aufgrund der Kodierung aller Zeichen derBMP in zwei Bytes hat die UTF-16-Kodierung bei Texten, welche hauptsächlich auslateinischen Buchstaben bestehen, den doppelten Platzbedarf im Vergleich zu geeignetenISO-8859-Kodierungen oder zu UTF-8. Werden jedoch viele BMP-Zeichen jenseits desCodepoints U+007F codiert, so benötigt UTF-16 vergleichbar viel oder weniger Platz als UTF-8.

Im Gegensatz zu UTF-8 besteht keine Kodierungsreserve. Wird ein UTF-16-kodierter Text alsISO 8859-1 interpretiert, so sind zwar sämtliche auch in letzterer Kodierung enthaltenen Buchstaben erkennbar, aber durch Null-Bytes getrennt; bei anderen ISO-8859-Kodierungen ist dieKompatibilität schlechter.

Normung

[Bearbeiten |Quelltext bearbeiten]

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

Kodierung

[Bearbeiten |Quelltext bearbeiten]

Zeichen auf der BMP

[Bearbeiten |Quelltext bearbeiten]

Die gültigen Zeichen derBMP (U+0000 bis U+D7FF und U+E000 bis U+FFFF) werden jeweils direkt auf ein einziges 16-Bit-Wort bzw. auf zwei Bytes abgebildet.

Zeichen außerhalb der BMP

[Bearbeiten |Quelltext bearbeiten]
Bildung + interne Zusammensetzung der zwei Teilblöcke. U' ist nicht der ursprüngliche Code U, sondern der Code nach Differenz­bildung: U' = U - 10000hex

Unicode-Zeichen außerhalb der BMP (d. h. U+10000 bis U+10FFFF) werden jeweils durch zwei zusammengehörige 16-Bit-Wörter (engl.code units), also insgesamt vier Bytes dargestellt. (Das sind zwar 32 Bits, aber die Kodierung ist nichtUTF-32.)

Um ein solches Zeichen in UTF-16 zu kodieren, wird zunächst von der Codenummer des Zeichens (hier U genannt) die Zahl 65536 (10000hex = Größe der BMP) abgezogen, wodurch eine 20-Bit-Zahl U' im Bereich von 00000hex bis FFFFFhex entsteht. Diese wird anschließend in zwei Blöcke zu je 10 Bit aufgeteilt:

  • dem ersten Block (d. h. den 10 höherwertigen Bits des Codes U') wird die Bitfolge 110110 vorangestellt, das entstandene 16-Bit-Wort aus zwei Byte bezeichnet man alsHigh-Surrogate
  • dem zweiten Block (d. h. den 10 niederwertigen Bits des Codes U') wird die Bitfolge 110111 vorangestellt, das entstandene 16-Bit-Wort aus zwei Byte bezeichnet man alsLow-Surrogate.

Folgende Codebereiche sind speziell für solche Surrogate, d. h. UTF-16-Ersatzzeichen, reserviert und enthalten daherkeine eigenständigen Zeichen:

  • von U+D800 bis U+DBFF (210 = 1024 High-Surrogates)
  • von U+DC00 bis U+DFFF (210 = 1024 Low-Surrogates).

Bei der Umwandlung von UTF-16-kodierten Zeichenketten in UTF-8-Bytefolgen ist zu beachten, dass Paare aus High- und Low-Surrogates zuerst wieder zu jeweils einem Unicode-Zeichencode zusammengefasst werden müssen, bevor dieser dann in eine UTF-8-Bytefolge umgewandelt werden kann (Beispiel in der Beschreibung zuUTF-8). Da dies oft nicht beachtet wird, hat sich eine andere, inkompatible Kodierung für die Ersatzzeichen etabliert, die im Nachhinein alsCESU-8 normiert worden ist.

Byte Order

[Bearbeiten |Quelltext bearbeiten]

Je nachdem, welches der beiden Bytes eines 16-Bit-Wortes zuerst übertragen bzw. gespeichert wird, spricht man vonBig Endian (UTF-16BE) oder vonLittle Endian (UTF-16LE). Unabhängig davon kommt dasHigh Surrogate-Wort immer vor demLow Surrogate-Wort.

FürASCII-Zeichen, die nach UTF-16 übersetzt werden, bedeutet dies, dass das hinzugefügte 0-Zeichen im höchstwertigen Bit

  • beiBig Endian vorangestellt und
  • beiLittle Endian nachgestellt wird.

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

Beispiele

[Bearbeiten |Quelltext bearbeiten]

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

Beispiele für UTF-16 Kodierungen
ZeichenCodepunktCodepunkt binärUTF-16BEbinärUTF-16BEhexadezimal
BuchstabeyU+007900000000 0111100100000000 0111100100 79
BuchstabeäU+00E400000000 1110010000000000 1110010000 E4
EurozeichenU+20AC00100000 1010110000100000 1010110020 AC
Violinschlüssel𝄞U+1D11E00000001 11010001 0001111011011000 00110100 11011101 00011110D8 34 DD 1E
CJK-Ideogramm 𤽜U+24F5C00000010 01001111 0101110011011000 01010011 11011111 01011100D8 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 (Im Beispiel in der Farbe Magenta angezeigt) und aus den so entstandenen Bits die Surrogates gebildet.

Beispiel-Berechnung der Surrogates

[Bearbeiten |Quelltext bearbeiten]

Alle Zahlen werden im Folgenden zur Basis 16 angegeben.

Für die Unicode-Position v
SG-Word1 =v10000400{\displaystyle {\tfrac {v-10000}{400}}} + D800SG-Word2 =vmod400{\displaystyle v\;{\bmod {\;}}400} + DC00
v{\displaystyle v}        = 64321SG-Word1 =6432110000400{\displaystyle {\tfrac {64321-10000}{400}}} + D800         = D950
SG-Word2 =64321mod400{\displaystyle 64321\;{\bmod {\;}}400} + DC00         = DF21

Siehe auch

[Bearbeiten |Quelltext bearbeiten]

Einzelnachweise

[Bearbeiten |Quelltext bearbeiten]
  1. Unicode 4.0, Anhang C (PDF; 155 kB)
Abgerufen von „https://de.wikipedia.org/w/index.php?title=UTF-16&oldid=247444452
Kategorie: