Zum Inhalt springen

UTF-8

aus Wikipedia, der freien Enzyklopädie
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 10. Oktober 2004 um 15:28 Uhr durch 212.202.73.77 (Diskussion). Sie kann sich erheblich von der aktuellen Version unterscheiden.

UTF-8 (Abk. für 8-bit Unicode Transformation Format) ist eine Kodierung für Unicode-Zeichen; dabei wird jedem Unicode-Zeichen eine speziell kodierte Bytekette von variabler Länge zugeordnet.

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
U0000 - U007F 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. 2^7 127
U0080 - U07FF 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 Unicodezeichens. Die Anzahl der Einsen bis zur ersten 0 im ersten Byte ist die Anzahl der Bytes für das Zeichen. 2^11 2048
U0800 - UFFFF 1110xxxx 10xxxxxx 10xxxxxx 2^16 65536
U10000 - U10FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 2^21 2097152

Theoretisch ließe sich das Schema fortsetzen, die aktuelle RFC beschränkt die Zeichen jedoch auf die durch UTF-16 erreichbaren, also bis U10FFFF. 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 größere 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.
  • 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.

Siehe auch: UTF-7, UTF-16, UTF-32, Unicode