UTF-8

UTF-8 (Abk. für 8-bit UCS Transformation Format wobei UCS wiederum Universal Character Set abkürzt) ist die am weitesten verbreitete Kodierung für Unicode-Zeichen (Unicode und UCS sind praktisch identisch). Die Kodierung wurde im September 1992 von Ken Thompson und Rob Pike bei Arbeiten an dem Plan 9-Betriebssystem festgelegt. Die Kodierung wurde zunächst im Rahmen von X/Open als FSS-UTF bezeichnet, in den Folgejahren erfolgte im Rahmen der Standardisierung die Umbenennung auf die heute übliche Bezeichnung UTF-8.[1]

Inhaltsverzeichnis

Allgemeines

Bei der UTF-8 Kodierung wird jedem Unicode-Zeichen eine speziell kodierte Bytekette variabler Länge zugeordnet. UTF-8 unterstützt bis zu vier Byte, auf die sich wie bei allen UTF-Formaten alle Unicode-Zeichen abbilden lassen.

UTF-8 hat eine zentrale Bedeutung als globale Zeichenkodierung im Internet. Die Internet Engineering Task Force verlangt von allen neuen Internetkommunikationsprotokollen, dass die Zeichenkodierung deklariert wird und dass UTF-8 eine der unterstützten Kodierungen ist. Das Internet Mail Consortium (IMC) empfiehlt, dass alle E-Mail-Programme UTF-8 darstellen und senden können.[2] 2008 wurde diese Empfehlung allerdings immer noch nicht global befolgt.

Auch bei dem in Webbrowsern verwendeten HTML setzt sich UTF-8 zur Darstellung sprachspezifischer Zeichen zunehmend durch und ersetzt die vorher benutzten HTML-Entities[3].

Eigenschaften

  • Multi-Byte-Zeichenkodierung (MBCS) ähnlich CP950/CP936/CP932(chinesisch/japanisch), aber ohne die (damals wichtige und nützliche) Eigenschaft, dass doppelt breit dargestellte Zeichen zwei Bytes lang sind
  • 7-Bit-ASCII ist gleichzeitig UTF-8 und hochgradig kompatibel zu bisherigen 8-Bit-Zeichensätzen
  • Trail-Bytes sind niemals 7-Bit-ASCII-Zeichen (ermöglicht Verarbeitung und Parsen mit üblichen 7-Bit-Zeichenkonstanten)
  • Relativ kompakt, besonders bei europäischen Zeichen, etwas weniger bei (bspw.) chinesischen Zeichen in höheren Kodepositionen, häufig deutlich kompakter als UTF-16 (Windows)
  • Sortierbarkeit bleibt erhalten, zwei UTF-8-Zeichenketten sortieren genauso wie zwei unkodierte Unicode-Zeichenketten
  • In beiden Richtungen durchsuchbar (bei bisherigen MBCS nicht der Fall)
  • Einfache Transkodierungsfunktion (zudem leicht hardware-implementierbar)
  • Reichlich Kodierungs-Reserve (falls sich am Unicode-Standard doch noch etwas ändert)

Normung

UTF-8 ist von der IETF, dem Unicode Consortium und der ISO gegenwärtig identisch definiert in den Normdokumenten:

  • RFC 3629 / STD 63 (2003)
  • The Unicode Standard, Version 4.0, §3.9–§3.10 (2003)
  • ISO/IEC 10646-1:2000 Annex D (2000)

Diese lösen ältere, teilweise abweichende Definitionen ab, die teilweise noch von älterer Software benutzt werden:

  • ISO/IEC 10646-1:1993 Amendment 2 / Annex R (1996)
  • The Unicode Standard, Version 2.0, Appendix A (1996)
  • RFC 2044 (1996)
  • RFC 2279 (1998)
  • The Unicode Standard, Version 3.0, §2.3 (2000) und Corrigendum #1: UTF-8 Shortest Form (2000)
  • Unicode Standard Annex #27: Unicode 3.1 (2001)

Kodierung

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, für die ausschließlich echte ASCII-Zeichen verwendet werden, in beiden Darstellungen identisch.

Unicode-Zeichen größer als 127 werden in der UTF-8-Kodierung zu Byteketten der Länge zwei bis vier kodiert.

Unicode-Bereich (hexadezimal) UTF-8-Kodierung (binär) Bemerkungen Möglichkeiten (theoretisch)
0000 0000 – 0000 007F 0xxxxxxx In diesem Bereich (128 Zeichen) entspricht UTF-8 genau dem ASCII-Code: Das höchste Bit ist 0, die restliche 7-Bit-Kombination ist das ASCII-Zeichen. 27 128
0000 0080 – 0000 07FF 110xxxxx 10xxxxxx Das erste Byte enthält binär 11xxxxxx, die folgenden Bytes 10xxxxxx; die x stehen für die fortlaufende Bitkombination des Unicode-Zeichens. Die Anzahl der Einsen vor der höchsten 0 im ersten Byte ist die Anzahl der Bytes für das Zeichen. (In Klammern jeweils die theoretisch maximal möglichen.) 211 − 27
(211)
1920
(2048)
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 bis zu acht Bytes lange Byteketten und dadurch über vier Billionen Zeichen zu (Die letzte Stufe enthielte als erstes Byte 11111111 und danach sieben Folge-Bytes. Die gesamte Codefolge wäre dann 242 = 4.398.046.511.104 Zeichen). In seiner Verwendung als UTF-Kodierung ist er aber auf den gemeinsamen Coderaum aller Unicode-Kodierungen beschränkt, also von 0 bis 0010 FFFF (1.114.112 Möglichkeiten) und weist maximal vier Bytes lange Byteketten auf.

Das erste Byte eines UTF-8-kodierten Zeichens nennt man dabei Start-Byte, weitere Bytes nennt man Folge-Bytes. Start-Bytes enthalten also die Bitfolge 0xxxxxxx oder 11xxxxxx, Folge-Bytes immer die Bitfolge 10xxxxxx.

  • Ist das höchste Bit des ersten Bytes 0, handelt es sich um ein ASCII-Zeichen, da ASCII eine 7-Bit-Kodierung ist und die ersten 128 Unicode-Zeichen den ASCII-Zeichen entsprechen. Damit sind alle ASCII-Zeichenketten automatisch aufwärtskompatibel zu UTF-8.
  • Ist das höchste Bit des ersten Bytes 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 Bytes 11, handelt es sich um das Startbyte eines Mehrbytezeichens, sind sie 10, um ein Folgebyte.
  • Die lexikalische Ordnung nach Bytewerten entspricht der lexikalischen Ordnung nach Zeichennummern, da höhere Zeichennummern mit entsprechend mehr 1-Bits im Start-Byte kodiert werden.
  • Bei den Startbytes von Mehrbyte-Zeichen gibt die Anzahl der höchsten 1-Bits die gesamte Bytezahl des als Mehrbyte-Zeichen kodierten Unicode-Zeichens an. Anders interpretiert, die Anzahl der 1-Bits links des höchsten 0-Bits entspricht der Anzahl an Folgebytes plus eins, z. B. 1110xxxx 10xxxxxx 10xxxxxx = drei Bits vor dem höchsten 0-Bit = drei Bytes insgesamt, zwei Bits nach dem höchsten 1-Bit vor dem höchsten 0-Bit = zwei Folgebytes.
  • Startbytes (0xxx xxxx oder 11xx xxxx) und Folgebytes (10xx xxxx) lassen sich eindeutig voneinander unterscheiden. Somit kann ein Bytestrom auch in der Mitte gelesen werden, ohne dass es Probleme mit der Dekodierung gibt, was insbesondere bei der Wiederherstellung defekter Daten wichtig ist. 10xxxxxx Bytes werden einfach übersprungen, bis ein 0xxxxxxx oder 11xxxxxx Byte gefunden wird. Könnten Startbytes und Folgebytes 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 (Zum Beispiel „a“ als 01100001 oder fälschlich als 11000001 10100001). Jedoch ist nur die jeweils kürzestmögliche Kodierung erlaubt. Dieser Umstand hat mehrfach zu Problemen geführt, indem Programme bei ungültigen Kodierungen abstürzen, diese als gültig interpretieren oder einfach ignorieren. Die Kombinationen der letzten beiden Verhaltensweisen führte z. B. zu Firewalls, die gefährliche Inhalte auf Grund der ungültigen Kodierung nicht erkennen, der zu schützende Client diese Kodierungen jedoch als gültig interpretiert und dadurch gefährdet ist.
  • Bei mehreren Bytes für ein Zeichen werden die Bits bündig angeordnet – das niedrigste Bit (least significant bit) des Unicode-Zeichens steht also immer im niedrigsten Bit des letzten UTF-8-Bytes.
  • Ursprünglich gab es auch Kodierungen mit mehr als vier Oktetten (bis zu sechs), 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 eine besonders platzsparende Methode zur Abbildung von Unicode-Zeichen.
  • Die Unicodebereiche U+D800–U+DBFF und U+DC00–U+DFFF sind ausdrücklich keine Zeichen, sondern dienen nur in UTF-16 zur Kodierung von Zeichen außerhalb der Basic Multilingual Plane, sie wurden früher als Low und High surrogates bezeichnet. Folglich sind Bytefolgen, die diesen Bereichen entsprechen, kein gültiges UTF-8. Zum Beispiel 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.[4] Aufgrund der weiten Verbreitung der falschen Kodierung, insbesondere auch in Datenbanken, wurde diese Kodierung nachträglich als CESU-8 normiert.
  • In UTF-8, UTF-16 und UTF-32 ist der gesamte Wertebereich von Unicode kodiert.

Durch die Kodierungsregel von UTF-8 sind bestimmte Bytes nicht zulässig. In nachfolgender Tabelle sind alle 256 Möglichkeiten zusammengefasst und deren Verwendung bzw. Gültigkeit angegeben. Bytes in roten Zeilen sind unzulässig, grün beschreibt zulässige Bytes, welche unmittelbar ein Zeichen darstellen. In blau sind jene Werte hinterlegt, welche den Start einer Sequenz von zwei oder mehr Byte beginnen und als Sequenz mit den Bytes aus orange hinterlegten Zeilen fortgesetzt werden.

UTF-8 Wertebereich Bedeutung
Binär Hexadezimal Dezimal
00000000-01111111 00-7F 0-127 Ein-Byte lange Zeichen, deckungsgleich mit US-ASCII.
10000000-10111111 80-BF 128-191 Zweites, drittes oder viertes Byte einer Bytesequenz.
11000000-11000001 C0-C1 192-193 Start einer 2 Byte langen Sequenz, welche den Codebereich aus 0 bis 127 abbildet, unzulässig
11000010-11011111 C2-DF 194-223 Start einer 2 Byte langen Sequenz
11100000-11101111 E0-EF 224-239 Start einer 3 Byte langen Sequenz
11110000-11110100 F0-F4 240-244 Start einer 4 Byte langen Sequenz (Inklusive der Codebereiche von 110000 bis 13FFFF)
11110101-11110111 F5-F7 245-247 Beschränkt von der RFC 3629: Start einer 4 Byte langen Sequenz für Codebereich über 140000
11111000-11111011 F8-FB 248-251 Beschränkt von der RFC 3629: Start einer 5 Byte langen Sequenz
11111100-11111101 FC-FD 252-253 Beschränkt von der RFC 3629: Start einer 6 Byte langen Sequenz
11111110-11111111 FE-FF 254-255 Ungültig. In der ursprünglichen UTF-8-Spezifikation nicht definiert.

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

Beispiele für UTF-8 Kodierungen
Zeichen Unicode Unicode binär UTF-8 binär UTF-8 hexadezimal
Buchstabe y U+0079 00000000 01111001 01111001 0x79
Buchstabe ä U+00E4 00000000 11100100 11000011 10100100 0xC3 0xA4
Zeichen für eingetragene Marke ® U+00AE 00000000 10101110 11000010 10101110 0xC2 0xAE
Eurozeichen U+20AC 00100000 10101100 11100010 10000010 10101100 0xE2 0x82 0xAC
Violinschlüssel Wikimedia Foundation.

Schlagen Sie auch in anderen Wörterbüchern nach:

  • UTF-8 — (8 bit Unicode Transformation Format) es un formato de codificación de caracteres Unicode e ISO 10646 utilizando símbolos de longitud variable. UTF 8 fue creado por Robert C. Pike y Kenneth L. Thompson. Está definido como estándar por la RFC 3629 …   Wikipedia Español

  • UTF-7 — (7 bit Unicode Transformation Format) is a variable length character encoding that was proposed for representing Unicode text using a stream of ASCII characters. It was originally intended to provide a means of encoding Unicode text for use in… …   Wikipedia

  • UTF-8 — (от англ. Unicode Transformation Format, 8 bit  «формат преобразования Юникода, 8 битный»)  распространённая кодировка символов Юникода, совместимая с 8 битными форматами передачи текста. Нашла широкое применение в операционных… …   Википедия

  • UTF-7 — (7 bit Unicode Transformation Format) es una codificación de caracteres de longitud variable que fue propuesta para representar texto codificado con Unicode usando un flujo de caracteres ASCII, para ser usado, por ejemplo en mensajes de correo… …   Wikipedia Español

  • UTF-8 — (UCS Transformation Format  8 bit[1]) is a multibyte character encoding for Unicode. Like UTF 16 and UTF 32, UTF 8 can represent every character in the Unicode character set. Unlike them, it is backward compatible with ASCII and avoids the… …   Wikipedia

  • UTF-16 — (англ. Unicode Transformation Format) в информатике один из способов кодирования символов из Unicode в виде последовательности 16 битных слов. Данная кодировка позволяет записывать символы Юникода в диапазонах U+0000..U+D7FF и… …   Википедия

  • UTF-16 — est un codage des caractères définis par Unicode où chaque caractère est codé sur une suite de un ou deux mots de 16 bits. Le codage était défini dans le rapport technique 17 à la norme Unicode. Depuis, cette annexe est devenue obsolète car UTF… …   Wikipédia en Français

  • Utf-16 — Unicode Jeux de caractères UCS (ISO/CEI 10646) ISO 646, ASCII ISO 8859 1 WGL4 UniHan Équivalences normalisées NFC (précomposée) NFD (décomposée) NFKC (compatibilité) NFKD (compatibilité) Propriétés et algorithmes ISO 15924 …   Wikipédia en Français

  • Utf-8 — (от англ. Unicode Transformation Format формат преобразования Юникода) в настоящее время распространённая кодировка, реализующая представление Юникода, совместимое с 8 битным кодированием текста. Текст, состоящий только из символов с номером… …   Википедия

  • UTF-8 — (UCS transformation format 8 bits) est un format de codage de caractères. Chaque caractère ou graphème est représenté dans le répertoire du jeu universel de caractères sous la forme d’une suite d’un ou plusieurs « caractères abstraits » …   Wikipédia en Français

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”