|
UTF-8 (Abk. für 8-bit Unicode Transformation Format) ist die populärste
Kodierung für Unicode-Zeichen; dabei wird jedem Unicode-Zeichen eine speziell
kodierte Bytekette von variabler Länge zugeordnet. UTF-8 unterstützt
bis zu 4 Byte, auf die sich wie bei allen UTF-Formaten alle 1.114.112 Unicode-Zeichen
abbilden lassen.
UTF-8 ist gegenwärtig als Request for Comments RFC 3629 standardisiert
(UTF-8, a transformation format of ISO 10646). Dieser Standard löst das
ältere RFC 2279 ab.
Unicode-Zeichen mit den Werten aus dem Bereich von 0 bis 127 (0 bis 7F hexadezimal)
werden in der UTF-8-Kodierung als ein Byte mit dem gleichen Wert wiedergegeben.
Insofern sind alle Daten, die ausschließlich echte ASCII-Zeichen verwenden,
in beiden Darstellungen identisch.
Unicode-Zeichen größer als 127 werden in der UTF-8-Kodierung zu
Byteketten der Länge zwei bis vier.
Unicode-Bereich UTF-8-Kodierung Bemerkungen Möglichkeiten
0000 0000 - 0000 007F 0xxxxxxx In diesem Bereich (128 Zeichen) entspricht UTF-8
genau dem ASCII-Code: Das erste Bit ist 0, die darauf folgende 7-Bitkombination
ist das ASCII-Zeichen. 27 128
0000 0080 - 0000 07FF 110xxxxx 10xxxxxx Das erste Byte beginnt mit binär
11, die folgenden Bytes beginnen mit binär 10; die x stehen für die
fortlaufende Bitkombination des Unicode-Zeichens. Die Anzahl der Einsen bis
zur ersten 0 im ersten Byte ist die Anzahl der Bytes für das Zeichen. [In
eckigen Klammern jeweils die theoretisch maximal möglichen.] 211 - 27
[211] 1.920
[2.048]
0000 0800 - 0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx 216 - 211
[216] 63.488
[65.536]
0001 0000 - 0010 FFFF [ 0001 0000 - 001F FFFF ] 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
220
[221] 1.048.576
[2.097.152]
Der Algorithmus lässt theoretisch mehrere Milliarden Zeichen zu (27 + 2(1*6+5)
+ 2(2*6+4) + 2(3*6+3) + 2(4*6+2) + 2(5*6+1) + 2(6*6+0) = 70.936.234.112) und
ist somit von allen UTF-Kodierungen die mächtigste, die aktuelle RFC beschränkt
diese jedoch auf die durch UTF-16 erreichbaren, deren Coderaum in Unicode definiert
ist, also von 0 bis 0010 FFFF (1.114.112 Möglichkeiten). Das erste Byte
eines UTF-8-kodierten Zeichens nennt man dabei Start-Byte, weitere Bytes nennt
man Folgebytes. Startbytes beginnen also mit der Bitfolge 11 oder einem 0-Bit,
während Folgebytes immer mit der Bitfolge 10 beginnen.
Betrachtet man die Bitfolgen etwas genauer, erkennt man die große Sinnfälligkeit
von UTF-8:
* Ist das höchste Bit des ersten Byte 0, handelt es sich um ein gewöhnliches
ASCII-Zeichen, da ASCII eine 7-Bit-Kodierung ist und die ersten 128 Zeichen
des Unicode die ASCII-Zeichen sind. Damit sind alle ASCII-Dokumente automatisch
aufwärtskompatibel zu UTF-8.
* Ist das höchste Bit des ersten Byte 1, handelt es sich um ein Mehrbytezeichen,
also ein Unicode-Zeichen mit einer Zeichennummer größer als 127.
* Sind die höchsten beiden Bits des ersten Byte 11, handelt es sich um
das Start-Byte eines Mehrbytezeichens, sind sie 10, um ein Folge-Byte.
* Die lexikalische Ordnung nach Byte-Werten entspricht der lexikalischen Ordnung
nach Buchstaben-Nummern, da höhere Zeichennummern mit entsprechend mehr
1-Bits am Anfang kodiert werden.
* Bei den Start-Bytes von Mehrbyte-Zeichen gibt die Anzahl der 1-Bits vor dem
ersten 0-Bit die gesamte Bytezahl des als Mehrbyte-Zeichen kodierten Unicode-Zeichens
an. Anders interpretiert, die Anzahl der 1-Bits vor dem ersten 0-Bit nach dem
ersten Bit entspricht der Anzahl an Folgebytes, z.B. 1110xxxx 10xxxxxx 10xxxxxx
3 Bits vor dem ersten 0-Bit = 3 Bytes insgesamt, 2 Bits vor dem ersten 0-Bit
nach dem ersten 1-Bit = 2 Folgebytes.
* Start-Bytes (0xxx xxxx oder 11xx xxxx) und Folge-Bytes (10xx xxxx) lassen
sich eindeutig voneinander unterscheiden. Somit kann ein Byte-Strom auch in
der Mitte gelesen werden, ohne dass es Probleme mit der Dekodierung gibt, was
insbesondere bei der Wiederherstellung defekter Daten wichtig ist. Bytes, die
mit 10 beginnen, werden einfach übersprungen, bis ein Byte gefunden wird,
das mit 0 oder 11 beginnt. Könnten Start-Bytes und Folge-Bytes nicht eindeutig
voneinander unterschieden werden, wäre das Lesen eines UTF-8-Datenstroms,
dessen Beginn unbekannt ist, unter Umständen nicht möglich.
Zu beachten:
* Das gleiche Zeichen kann theoretisch auf verschiedene Weise kodiert werden.
Jedoch ist nur die jeweils kürzeste mögliche Kodierung erlaubt.
* Bei mehreren Bytes für ein Zeichen werden die Bits rechtsbündig
angeordnet – das rechte Bit des Unicode-Zeichens steht also immer im rechten
Bit des letzten UTF-8-Bytes.
* Ursprünglich gab es auch Kodierungen mit mehr als 4 Oktetts (bis zu 6),
diese sind jedoch ausgeschlossen worden, da es in Unicode keine korrespondierenden
Zeichen gibt und ISO 10646 in seinem möglichen Zeichenumfang an Unicode
angeglichen wurde.
* Für alle auf dem Lateinischen Alphabet basierenden Schriften ist UTF-8
die platzsparendste Methode zur Abbildung von Unicode-Zeichen.
* Die code points U+D800-U+DBFF und U+DC00-U+DFFF sind als Low und High surrogates
in der Unicode BMP reserviert (für UTF-16) und sollten entsprechend auch
nicht codiert werden. z.B. wird U+10400 in UTF-16 als D801,DC00 dargestellt,
sollte in UTF-8 aber als F0,90,90,80 und nicht als ED,A0,81,ED,B0,80 ausgedrückt
werden. Java unterstützt dies seit der Version 1.5, siehe: http://java.sun.com/developer/technicalArticles/Intl/Supplementary/
* UTF-8, UTF-16 und UTF-32 kodieren alle den vollen Wertebereich von Unicode.
Die Scriptsprache Tcl verwendet intern für alle Strings UTF-8.
[Bearbeiten]
Beispiele
* Der Buchstabe ä wird als 0xc3 0xa4 kodiert.
* Der Buchstabe ö wird als 0xc3 0xb6 kodiert.
* Das Euro-Zeichen € wird als 0xe2 0x82 0xac kodiert.
|