UTF-8 (Abkürzung für8-BitUCS Transformation Format, wobeiUCS wiederumUniversal Coded Character Set abkürzt) ist die am weitesten verbreiteteKodierung fürUnicode-Zeichen (Unicode und UCS sind praktisch identisch). Die Kodierung wurde im September 1992 vonKen Thompson undRob Pike bei Arbeiten amPlan-9-Betriebssystem festgelegt. Sie wurde zunächst im Rahmen vonX/Open alsFSS-UTF bezeichnet (filesystem safe UTF in Abgrenzung zuUTF-1, das diese Eigenschaft nicht hat), in den Folgejahren erfolgte im Rahmen der Standardisierung die Umbenennung auf die heute übliche BezeichnungUTF-8.[1]
Kodierung der 10 Millionen meistaufgerufenen Websites von 2010 bis 2021Nutzung der wichtigsten Kodierungen im Web von 2001 bis 2012, aufgezeichnet von Google
UTF-8 hat sich alsDe-facto-Standard-Zeichenkodierung des Internets und damit verbundener Dokumenttypen etabliert. Im April 2023 verwendeten 97,9 % aller Websites UTF-8[2] und 98,8 % der Top 1000.[3]
Auch bei der inWebbrowsern angewendeten AuszeichnungsspracheHTML hat sich UTF-8 zur Darstellung sprachspezifischer Zeichen durchgesetzt (über 97 % Anteil im Oktober 2021) und ersetzt dabei die vorher genutztenHTML-Entitäten.[4]
DieInternet Engineering Task Force verlangt von allen neuen Internet-Kommunikationsprotokollen, dass die Zeichenkodierung deklariert wird und dass UTF-8 eine der unterstützten Kodierungen ist. DasInternet Mail Consortium (IMC) empfiehlt, dass alleE-Mail-Programme UTF-8 darstellen und senden können.[5]
Bei der UTF-8-Kodierung wird jedem Unicode-Zeichen eineByte-Kette mit einer Länge von zwischen einem und vier Byte zugeordnet.[Anm. 1] Damit lassen sich – wie bei allenUTF-Formaten – alle Unicode-Zeichen abbilden.
Die ersten 128 Unicodezeichen (U+0000 bis U+007F, entsprechend den Positionen 0–127 in allenISO-8859-Varianten, auch als 7-Bit-ASCII-bezeichnet) werden in UTF-8 deckungsgleich durch nur ein Byte dargestellt. Dies umfasst unter anderem die Ziffern und die Groß- und Kleinbuchstaben des lateinischen Grundalphabets. Zusätzliche Zeichen in europäischen Sprachen mit lateinischer Schrift, z. B. ä, ß, é, ł und Š, werden durch zwei Byte dargestellt. Texte in solchen Sprachen benötigen daher nur wenig mehr als ein Byte pro Zeichen. Englischsprachige Texte lassen sich im Regelfall sogar mit nicht-UTF-8-fähigenTexteditoren ohne Beeinträchtigung bearbeiten.
Auchgriechische,kyrillische oderarabische Buchstaben – generell alle weiteren Zeichen bis U+07FF – belegen zwei Bytes. Alle weiteren Zeichen derBasic multilingual plane (BMP) – also U+0800 bis U+FFFF – werden durch drei Bytes kodiert. Dies betrifft insbesondere Zeichen aus indischen und fernöstlichen Schriften (vgl.Liste der Unicodeblöcke). Für die Darstellung seltener Zeichen außerhalb der BMP werden vier Byte je Zeichen benötigt.
Im Vergleich zuUTF-16, bei demalle Zeichen der BMP von Unicode durch zwei Byte dargestellt werden (und Zeichen jenseits der BMP durch zweimal zwei Bytes), ist UTF-8 für Texte mit relativ hohem Anteil an 7-Bit-ASCII-Zeichen deutlich kompakter, jedoch platzintensiver bei asiatischen Schriften.
Unicode-Zeichen mit Werten aus dem Bereich von 0 bis 127 (U+0000 bis U+007F) werden in der UTF-8-Kodierung als einByte[Anm. 1] mit dem gleichen Wert wiedergegeben. In diesem und nur in diesem Fall hat ein Byte der UTF-8-Kodierung eine Null 0 als erstes Bit.
Unicode-Zeichen größer als 127 werden in der UTF-8-Kodierung zu 2 bis 4 Byte langen Bytefolgen. Dabei beginnt das erste Byte immer mit11, die weiteren Bytes mit10. Die Anzahl der Einsen1 vor der ersten Null0 im ersten Byte ist gleich der Gesamtzahl der Bytes für das Zeichen. Die Bits, die in Unicode ein Zeichen darstellen, werden bündig angeordnet – das niedrigste Bit (least significant bit) des Unicode-Zeichens steht also immer im niedrigsten Bit des letzten UTF-8-Bytes.
Das erste Byte eines UTF-8-kodierten Zeichens nennt man dabeiStart-Byte, weitere Bytes heißenFolge-Bytes. Start-Bytes beginnen also immer mit0 oder11, Folge-Bytes immer mit10.
Unicode Codepoints
UTF-8-Kodierung
Anzahl kodierbarer Zeichen
Byte 1
Byte 2
Byte 3
Byte 4
im Standard erlaubt
theoretisch möglich
U+0000 – U+007F
0a6a5a4a3a2a1a0
(27
128
(27
128
U+0080 – U+07FF
1 1 0 b2b1b0a7a6
1 0 a5a4a3a2a1a0
(211 − 27
1920
(211
2048
U+0800 – U+FFFF
1 1 1 0 b7b6b5b4
1 0 b3b2b1b0a7a6
1 0 a5a4a3a2a1a0
(216 − 211
63.488
(216
65.536
U+010000 – U+10FFFF
1 1 1 1 0 c4c3c2
1 0 c1c0b7b6b5b4
1 0 b3b2b1b0a7a6
1 0 a5a4a3a2a1a0
(220
1.048.576
(221
2.097.152
In folgender Tabelle sind einige Kodierungsbeispiele für UTF-8 angegeben:
Das letzte Beispiel liegt außerhalb des ursprünglich in Unicode (vor Version 2.0) enthaltenen Codebereiches (16 Bit), der in der aktuellen Unicode-Version alsBMP-Bereich (Ebene 0) enthalten ist. 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 einErsatzzeichen dargestellt, welches als Platzhalter dient.
Aus dem Algorithmus ergeben sich folgende Eigenschaften von UTF-8:
Ist das höchste Bit des ersten Bytes0, handelt es sich um einASCII-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, oder anders ausgedrückt: Alle Daten, für die ausschließlich ASCII-Zeichen verwendet werden, sind in beiden Darstellungen identisch. Für alle auf demlateinischen Alphabetbasierenden Schriften ist UTF-8 daher eine besonders platzsparende Methode zur Abbildung von Unicode-Zeichen.
Die UTF-8-Kodierungen mit bis zu drei Bytes umfassen die gesamte nullte Unicode-Ebene (Plane 0: Basic Multilingual Plane, Zeichen 0 bis 65.535) und nur diese. Zeichen außerhalb der nullten Ebene benötigen also immer vier Bytes inUTF-8.
DieByte-Reihenfolge für Mehrbytezeichen ist eindeutig vorgegeben. Es müssen also keine Varianten wiebig-endian undlittle-endian berücksichtigt werden. So funktionieren Suchalgorithmen mit einfachem Vergleich auf Byte-Ebene und in beide Richtungen.
Dielexikalische Ordnung nach Bytewerten entspricht der lexikalischen Ordnung nach Unicode-Zeichennummern, da höhere Zeichennummern mit entsprechend mehr1-Bits im Start-Byte kodiert werden.
Startbytes (0… oder11…) und Folgebytes (10…) 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.
Durch den einfachen Algorithmus erfordert die (De-)Kodierung wenig Rechenaufwand (anders als etwa beiUTF-1).
Dieser Algorithmus lässt theoretisch längere Bytesequenzen zu. Ursprünglich wurden auch Folgen aus fünf Bytes (Startbyte 111110xx: F8hex bis FBhex) und sechs Bytes (Startbyte 1111110x: FChex und FDhex) definiert, in denen so insgesamt 31 Bit für den enthaltenen Unicode-Wert kodiert werden konnten. In seiner Verwendung alsUTF-Kodierung ist er aber auf den gemeinsamen Coderaum aller Unicode-Kodierungen beschränkt, also von U+0000 bis U+10FFFF (17Ebenen mit insgesamt 1.114.112 Codepoints) und weist maximal vier Bytes lange Byteketten auf. Längere Bytefolgen und größere Werte gelten heute als unzulässige Codes und sind entsprechend zu behandeln.
Nach diesem Algorithmus könnten Zeichen auf unterschiedliche Weise kodiert werden, indem zusätzliche leere Bytes in die UTF-8-Kodierung übertragen werden – zum Beispiel der Buchstabe „y“ als 01111001 (79hex) oder fälschlich als 11000001 10111001 (C1 B9hex). Jedoch erlaubt der Standard nur die jeweils kürzestmögliche Kodierung. Aus diesem Grund können C0hex und C1hex niemals in gültigem UTF-8-Code vorkommen. Analog wird „Ω“ als CE A9hex kodiert, aber nicht als E0 8E A9hex oder gar als F0 80 8E A9hex. Diese Mehrdeutigkeit hat mehrfach zu Problemen geführt, wenn 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, wo jedoch der zu schützende Client diese Kodierungen als gültig interpretiert und dadurch gefährdet ist.
Die Unicode-Bereiche U+D800 bis U+DFFF sind ausdrücklich keine Zeichen, sondern dienen nur inUTF-16 zur Kodierung von Zeichen außerhalb derBasic Multilingual Plane, sie wurden früher alsLow undHigh 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, darf in UTF-8 aber nur als F0 90 90 80hex und nicht als ED A0 81 ED B0 80hex ausgedrückt werden.Java unterstützt dies seit der Version 1.5.[9] Aufgrund der weiten Verbreitung der falschen Kodierung, insbesondere auch in Datenbanken, wurde diese Kodierung nachträglich alsCESU-8 normiert.
Durch die Kodierungsregel von UTF-8 sind bestimmte Bytewerte nicht zulässig. In nachfolgender Tabelle sind alle 256 Möglichkeiten aufgeführt und deren Verwendung bzw. Gültigkeit angegeben. Bytewerte in roten Zeilen sind unzulässig, grün beschreibt zulässige Bytewerte, 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 Bytewerten 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 U+0000 … U+007F
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, die U+0000 … U+007F kodiert, unzulässig
11000010–11011111
C2–DF
194–223
Start einer 2 Byte langen Sequenz, kodiert U+0080 … U+07FF
Startbyte
abgedeckter Codebereich
C2
U+0080 … U+00BF
C3
U+00C0 … U+00FF
C4
U+0100 … U+013F
C5
U+0140 … U+017F
C6
U+0180 … U+01BF
C7
U+01C0 … U+01FF
C8
U+0200 … U+023F
C9
U+0240 … U+027F
CA
U+0280 … U+02BF
CB
U+02C0 … U+02FF
CC
U+0300 … U+033F
CD
U+0340 … U+037F
CE
U+0380 … U+03BF
CF
U+03C0 … U+03FF
D0
U+0400 … U+043F
D1
U+0440 … U+047F
D2
U+0480 … U+04BF
D3
U+04C0 … U+04FF
D4
U+0500 … U+053F
D5
U+0540 … U+057F
D6
U+0580 … U+05BF
D7
U+05C0 … U+05FF
D8
U+0600 … U+063F
D9
U+0640 … U+067F
DA
U+0680 … U+06BF
DB
U+06C0 … U+06FF
DC
U+0700 … U+073F
DD
U+0740 … U+077F
DE
U+0780 … U+07BF
DF
U+07C0 … U+07FF
11100000–11101111
E0–EF
224–239
Start einer 3 Byte langen Sequenz, kodiert U+0800 … U+FFFF
Startbyte
abgedeckter Codebereich
E0
U+0800 … U+0FFF(2. Byte: 80 … 9F ist unzulässige Kodierung für U+0000 … U+07FF als 3-Byte-Sequenz)
E1
U+1000 … U+1FFF
E2
U+2000 … U+2FFF
E3
U+3000 … U+3FFF
E4
U+4000 … U+4FFF
E5
U+5000 … U+5FFF
E6
U+6000 … U+6FFF
E7
U+7000 … U+7FFF
E8
U+8000 … U+8FFF
E9
U+9000 … U+9FFF
EA
U+A000 … U+AFFF
EB
U+B000 … U+BFFF
EC
U+C000 … U+CFFF
ED
U+D000 … U+DFFF(2. Byte A0 … BF ist unzulässig, sieheCESU-8)
Wenn Daten mit einer anderen Kodierung (beispielsweiseISO-8859) als UTF-8 gelesen werden oder umgekehrt, können Zeichen falsch dargestellt werden.
Kann eine Byte-Sequenz nicht als UTF-8-Zeichen interpretiert werden, so wird es beim Lesen in der Regel durch dasErsetzungszeichen � (U+FFFD, in UTF-8: EF BF BDhex) ersetzt.
Die Buchstaben deslateinischen Grundalphabets sowie die wichtigsten Satzzeichen werden in UTF-8 undISO 8859 identisch angezeigt. Probleme mit der falsch gewählten Zeichencodierung treten bei den anderen Zeichen auf, beispielsweise beiUmlauten. In deutschsprachigen Texten treten diese Zeichen jedoch nur vereinzelt auf, sodass der Text zwar stark entstellt wirkt, aber meist noch lesbar bleibt.
In UTF-8 bestehen die Umlaute desdeutschen Alphabets (sofern sie in derNormalform NFC vorliegen, also alsprecomposed character) und das ß aus zwei Bytes; nach ISO 8859-1 und ‑15 wird jedes dieser Zeichen als ein Byte codiert und jedes Byte beim Lesen in ein Zeichen transformiert. Das in der UTF-8-Kodierung dieser Buchstaben gemeinsame erste Byte C3hex wird in den meisten ISO-8859-Varianten als à decodiert. Bei ÄÖÜß wird das zweite Byte nicht oder mit dem gleichen Fehler-Zeichen dargestellt, weil 7Fhex bis 9Fhex in ISO 8859 nicht definiert sind.
Umgekehrt führen bei der Interpretation eines in ISO-8859-codierten Textes als UTF-8 die Buchstaben öü zur Anzeige eines Ersetzungszeichens, weil der entsprechende Byte-Wert nicht definiert ist. Bei den Buchstaben ÄÖÜß wird ein Start-Byte angenommen und versucht, das nächste Byte als Folgebyte gemeinsam als ein Zeichen zu interpretieren. Das scheitert in der Regel, weil die Codierungen der meisten Buchstaben – aller Buchstaben im Fall von ISO 8859-1 – keine gültigen Folgebytes sind. Bei einem ä wird sogar versucht, die nächsten beiden Bytes als Folgebytes zu interpretieren, was aus denselben Gründen regelmäßig scheitert. Je nach Programmierung des anzeigenden Programms verschwinden womöglich entsprechend viele Buchstaben aus dem Text.
Ein Beispiel für das WortHöhe:
UTF-8-Text in ISO-8859-1/15-Umgebung
Höhe →Höhe.
ISO-8859-1-Text in UTF-8-Umgebung
Höhe →H�he. Da ein Byte mit dem Hexadezimalwert F6 in UTF-8 nicht zulässig ist, kann es anstelle des Ersetzungszeichens auch zu einer Fehlermeldung mit Abbruch kommen.
Bei anderen Sprachen, die das lateinische Alphabet verwenden (Französisch, Schwedisch, Kroatisch…) sind die Verhältnisse ähnlich. Texte mit nichtlateinischen Alphabeten (z. B. inISO 8859-7 codierter griechischer Text) sind hingegen unlesbar, wenn sie als UTF-8 interpretiert werden.
Obwohl bei UTF-8 aufgrund der Art der Kodierung grundsätzlich nicht das Problem unterschiedlicherBytereihenfolgen auftreten kann, fügen einige Programme eineByte Order Mark (BOM,deutschBytereihenfolge-Markierung) am Dateianfang von UTF-8-Dateien ein. Die BOM besteht aus der Bytesequenz EF BB BF, die in nicht UTF-8-fähigenTexteditoren undBrowsern meist alsISO-8859-1-Zeichenfolge  erscheint und für Kompatibilitätsprobleme verantwortlich sein kann.