UTF-16
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.
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]
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 (BOM, byte 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:
Zeichen | Codepunkt | Codepunkt binär | UTF-16BEbinär | UTF-16BEhexadezimal |
---|---|---|---|---|
Buchstabey | 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 (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 = + D800SG-Word2 = + DC00
= 64321SG-Word1 = + D800 = D950
SG-Word2 = + DC00 = DF21
Siehe auch
[Bearbeiten |Quelltext bearbeiten]Einzelnachweise
[Bearbeiten |Quelltext bearbeiten]- ↑Unicode 4.0, Anhang C (PDF; 155 kB)