# UTF-8

UTF-8 (Abkürzung für 8-Bit UCS Transformation Format, wobei UCS wiederum Universal Coded 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 am Plan-9-Betriebssystem festgelegt. Sie wurde zunächst im Rahmen von X/Open als FSS-UTF bezeichnet (filesystem safe UTF in Abgrenzung zu UTF-1, das diese Eigenschaft nicht hat), in den Folgejahren erfolgte im Rahmen der Standardisierung die Umbenennung auf die heute übliche Bezeichnung UTF-8.

## Verbreitung

UTF-8 hat sich als De-facto-Standard-Zeichenkodierung des Internets und damit verbundener Dokumenttypen etabliert. Im April 2023 verwendeten 97,9 % aller Websites UTF-8 und 98,8 % der Top 1000.
Auch bei der in Webbrowsern angewendeten Auszeichnungssprache HTML hat sich UTF-8 zur Darstellung sprachspezifischer Zeichen durchgesetzt (über 97 % Anteil im Oktober 2021) und ersetzt dabei die vorher genutzten HTML-Entitäten.
Die Internet Engineering Task Force verlangt von allen neuen Internet-Kommunikationsprotokollen, 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.

## Normung

UTF-8 ist von der IETF, dem Unicode-Konsortium und der ISO gegenwärtig identisch definiert in den Normdokumenten:
* RFC 3629 / STD 63 (2003)RFC 3629 / STD 63
* 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)

## Allgemeine Eigenschaften

Bei der UTF-8-Kodierung wird jedem Unicode-Zeichen eine Byte-Kette mit einer Länge von zwischen einem und vier Byte zugeordnet. Damit lassen sich – wie bei allen UTF-Formaten – alle Unicode-Zeichen abbilden.
Die ersten 128 Unicodezeichen (U+0000 bis U+007F, entsprechend den Positionen 0–127 in allen ISO-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. ä, ß, é, ł, Š, 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ähigen Texteditoren ohne Beeinträchtigung bearbeiten.
Griechische, kyrillische oder arabische Buchstaben belegen ebenfalls zwei Bytes. Zeichen aus indischen und fernöstlichen Schriften belegen meist drei Byte, einige seltene Zeichen und Schriften sogar vier Byte je Zeichen.
Im Vergleich zu UTF-16, bei dem alle Zeichen der Basic multilingual plane (BMP) von Unicode durch zwei Byte dargestellt werden, ist UTF-8 für Texte mit relativ hohem Anteil an 7-Bit-ASCII-Zeichen deutlich kompakter, jedoch platzintensiver bei Zeichen zwischen U+0800 und U+FFFF (v. a. asiatische Sprachen, vgl. Liste der Unicodeblöcke)
Aus dem im Folgenden beschriebenen Algorithmus ergeben sich weiterhin folgende Eigenschaften:
* Multibyte-Zeichenfolgen bestehen niemals aus 7-Bit-ASCII-Zeichen (ermöglicht Verarbeitung und Parsen mit üblichen 7-Bit-Zeichenkonstanten).
* Sortierbarkeit bleibt erhalten, zwei UTF-8-Zeichenketten haben dieselbe Sortierreihenfolge wie zwei unkodierte Unicode-Zeichenketten
* In beiden Richtungen durchsuchbar (bei bisherigen MBCS nicht der Fall)
* Einfache Transkodierungsfunktion (zudem leicht Hardware-implementierbar)
* Reichlich Kodierungsreserve (falls sich am Unicode-Standard doch noch etwas ändert)
* selbstsynchronisierend

## Kodierung
### Algorithmus

Unicode-Zeichen mit Werten aus dem Bereich von 0 bis 127 (U+00 bis U+7F) werden in der UTF-8-Kodierung als ein Byte 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 mit 11, die weiteren Bytes mit 10. Die Anzahl der Einsen 1 vor der ersten Null 0 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 dabei Start-Byte, weitere Bytes heißen Folge-Bytes. Start-Bytes beginnen also immer mit 0 oder 11, Folge-Bytes immer mit 10.
| Unicode Codepoints | UTF-8-Kodierung | UTF-8-Kodierung | UTF-8-Kodierung | UTF-8-Kodierung | Anzahl kodierbarer Zeichen | Anzahl kodierbarer Zeichen | Anzahl kodierbarer Zeichen | Anzahl kodierbarer Zeichen |
| Unicode Codepoints | Byte 1 | Byte 2 | Byte 3 | Byte 4 | im Standard erlaubt | im Standard erlaubt | theoretisch möglich | theoretisch möglich |
| U+0000 – U+007F | 0 a$_6$a$_5$a$_4$a$_3$a$_2$a$_1$a$_0$ | | | | (2$^7$ | 128 | (2$^7$ | 128 |
| U+0080 – U+07FF | 1 1 0 b$_2$b$_1$b$_0$a$_7$a$_6$ | 1 0 a$_5$a$_4$a$_3$a$_2$a$_1$a$_0$ | | | (2$^{11}$ − 2$^7$ | 1920 | (2$^{11}$ | 2048 |
| U+0800 – U+FFFF | 1 1 1 0 b$_7$b$_6$b$_5$b$_4$ | 1 0 b$_3$b$_2$b$_1$b$_0$a$_7$a$_6$ | 1 0 a$_5$a$_4$a$_3$a$_2$a$_1$a$_0$ | | (2$^{16}$ − 2$^{11}$ | 63.488 | (2$^{16}$ | 65.536 |
| U+01 0000 – U+10 FFFF | 1 1 1 1 0 c$_4$c$_3$c$_2$ | 1 0 c$_1$c$_0$b$_7$b$_6$b$_5$b$_4$ | 1 0 b$_3$b$_2$b$_1$b$_0$a$_7$a$_6$ | 1 0 a$_5$a$_4$a$_3$a$_2$a$_1$a$_0$ | (2$^{20}$ | 1.048.576 | (2$^{21}$ | 2.097.152 |
Mit vier Bytes lässt sich der gesamte Unicode-Bereich abdecken (auch UTF-16 und UTF-32 kodieren den gesamten Wertebereich von Unicode).

### Beispiele

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 | 79 |
| Buchstabe ä | U+00E4 | 00000000 11100100 | 11000011 10100100 | C3 A4 |
| Griechischer Großbuchstabe Omega Ω | U+03A9 | 00000011 10101001 | 11001110 10101001 | CE A9 |
| Eurozeichen € | U+20AC | 00100000 10101100 | 11100010 10000010 10101100 | E2 82 AC |
| Violinschlüssel 𝄞 | U+1D11E | 00000001 11010001 00011110 | 11110000 10011101 10000100 10011110 | F0 9D 84 9E |
Das letzte Beispiel liegt außerhalb des ursprünglich in Unicode (unter Version 2.0) enthaltenen Codebereiches (16 Bit), der in der aktuellen Unicode-Version als BMP-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 ein Ersatzzeichen dargestellt, welches als Platzhalter dient.

### Folgerungen

Aus dem Algorithmus ergeben sich folgende Eigenschaften von UTF-8:
* 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, oder anders ausgedrückt: Alle Daten, für die ausschließlich ASCII-Zeichen verwendet werden, sind in beiden Darstellungen identisch. Für alle auf dem lateinischen Alphabet basierenden Schriften ist UTF-8 daher eine besonders platzsparende Methode zur Abbildung von Unicode-Zeichen.
* 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 eines Bytes 11, handelt es sich um das Startbyte eines Mehrbytezeichens, sind sie 10, um ein Folgebyte.
* 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 in UTF-8.
* 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.
* Startbytes (0… oder 11…) 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. Bytes beginnend mit 10 werden einfach übersprungen, bis 0… oder 11… erkannt wird. Dass Startbytes und Folgebytes eindeutig voneinander unterschieden sind, ist ein Vorteil der UTF-8-Kodierung. Bei Kodierungen ohne diese Eigenschaft ist das Lesen eines Datenstroms, dessen Beginn unbekannt ist, unter Umständen nicht möglich.

### Unzulässige Bereiche

Dieser Algorithmus lässt theoretisch längere Bytesequenzen zu. Ursprünglich wurden auch Folgen aus fünf Bytes (Startbyte 111110xx: F8$_{hex}$ bis FB$_{hex}$) und sechs Bytes (Startbyte 1111110x: FC$_{hex}$ und FD$_{hex}$) definiert, in denen so insgesamt 31 Bit für den enthaltenen Unicode-Wert kodiert werden konnten. In seiner Verwendung als UTF-Kodierung ist er aber auf den gemeinsamen Coderaum aller Unicode-Kodierungen beschränkt, also von U+0000 bis U+10FFFF (17 Ebenen 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. Außerdem gibt es weitere Einschränkungen:
* Nach diesem Algorithmus könnten Zeichen auf unterschiedliche Weise kodiert werden – zum Beispiel der Buchstabe „y“ als 01111001 (79$_{hex}$) oder fälschlich als 11000001 10111001 (C1 B9$_{hex}$). Jedoch erlaubt der Standard nur die jeweils kürzestmögliche Kodierung. Aus diesem Grund können C0$_{hex}$ und C1$_{hex}$ niemals in gültigem UTF-8-Code vorkommen. Analog wird „Ω“ als CE A9$_{hex}$ kodiert, aber nicht als E0 8E A9$_{hex}$ oder gar als F0 80 8E A9$_{hex}$. 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+DBFF und U+DC00 bis 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. Aufgrund der weiten Verbreitung der falschen Kodierung, insbesondere auch in Datenbanken, wurde diese Kodierung nachträglich als CESU-8 normiert.

### Zulässige Bytes und ihre Bedeutung

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 | UTF-8 Wertebereich | UTF-8 Wertebereich | Bedeutung |
| Binär | Hexadezimal | Dezimal | Bedeutung |
| 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 Startbyteabgedeckter Codebereich C2U+0080 … U+00BF C3U+00C0 … U+00FF C4U+0100 … U+013F C5U+0140 … U+017F C6U+0180 … U+01BF C7U+01C0 … U+01FF C8U+0200 … U+023F C9U+0240 … U+027F CAU+0280 … U+02BF CBU+02C0 … U+02FF CCU+0300 … U+033F CDU+0340 … U+037F CEU+0380 … U+03BF CFU+03C0 … U+03FF D0U+0400 … U+043F D1U+0440 … U+047F D2U+0480 … U+04BF D3U+04C0 … U+04FF D4U+0500 … U+053F D5U+0540 … U+057F D6U+0580 … U+05BF D7U+05C0 … U+05FF D8U+0600 … U+063F D9U+0640 … U+067F DAU+0680 … U+06BF DBU+06C0 … U+06FF DCU+0700 … U+073F DDU+0740 … U+077F DEU+0780 … U+07BF DFU+07C0 … U+07FF |
| 11100000–11101111 | E0–EF | 224–239 | Start einer 3 Byte langen Sequenz, kodiert U+0800 … U+FFFF Startbyteabgedeckter Codebereich E0 U+0800 … U+0FFF (2. Byte: 80 … 9F ist unzulässige Kodierung für U+0000 … U+07FF) E1U+1000 … U+1FFF E2U+2000 … U+2FFF E3U+3000 … U+3FFF E4U+4000 … U+4FFF E5U+5000 … U+5FFF E6U+6000 … U+6FFF E7U+7000 … U+7FFF E8U+8000 … U+8FFF E9U+9000 … U+9FFF EAU+A000 … U+AFFF EBU+B000 … U+BFFF ECU+C000 … U+CFFF EDU+D000 … U+DFFF (2. Byte A0 … BF ist unzulässig, siehe CESU-8) EEU+E000 … U+EFFF (Private Use Zone) EFU+F000 … U+FFFF (Private Use Zone, wenn 2. Byte im Bereich 80 … A3) |
| 11110000–11110100 | F0–F4 | 240–244 | Start einer 4 Byte langen Sequenz, kodiert U+100000 … U+10FFFF(≥ 110000$_{hex}$ nicht mehr in Unicode) Startbyteabgedeckter Codebereich F0U+10000 … U+3FFFF (2. Byte 80 … 8F ist unzulässige Kodierung von U+0000 … U+FFFF; 9/A/B… bilden Unicode-Ebenen 1–3 ab) F1U+40000 … U+7FFFF (Ebene 4–7, derzeit nicht verwendet) F2U+80000 … U+BFFFF (Ebene 8–11, derzeit nicht verwendet) F3U+C0000 … U+FFFFF (Ebene 12–15) F4U+100000 … U+10FFFF (2. Byte muss aus Bereich 80 … 8F sein; Ebenen >16 sind in Unicode undefiniert) |
| 11110101–11110111 | F5–F7 | 245–247 | Ungültig nach RFC 3629: Start einer 4 Byte langen Sequenz für Bereich ab 140000$_{hex}$ (nicht mehr in Unicode) |
| 11111000–11111011 | F8–FB | 248–251 | Ungültig nach RFC 3629: Start einer 5 Byte langen Sequenz |
| 11111100–11111101 | FC–FD | 252–253 | Ungültig nach 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. |
| Code | …0 | …1 | …2 | …3 | …4 | …5 | …6 | …7 | …8 | …9 | …A | …B | …C | …D | …E | …F |
| 0… | NUL | SOH | STX | ETX | EOT | ENQ | ACK | BEL | BS | HT | LF | VT | FF | CR | SO | SI |
| 1… | DLE | DC1 | DC2 | DC3 | DC4 | NAK | SYN | ETB | CAN | EM | SUB | ESC | FS | GS | RS | US |
| 2… | SP | ! | " | # | $ | % | & | ' | ( | ) | * | + | , | - | . | / |
| 3… | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | : | ; | < | = | > | ? |
| 4… | @ | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O |
| 5… | P | Q | R | S | T | U | V | W | X | Y | Z | [ | \ | ] | ^ | _ |
| 6… | ` | a | b | c | d | e | f | g | h | i | j | k | l | m | n | o |
| 7… | p | q | r | s | t | u | v | w | x | y | z | { | | | } | ~ | DEL |
| 8… | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz |
| 9… | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz |
| A… | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz |
| B… | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz | Zweites, drittes oder viertes Byte einer Bytesequenz |
| C… | unzulässig | unzulässig | Start einer 2 Byte langen Sequenz | Start einer 2 Byte langen Sequenz | Start einer 2 Byte langen Sequenz | Start einer 2 Byte langen Sequenz | Start einer 2 Byte langen Sequenz | Start einer 2 Byte langen Sequenz | Start einer 2 Byte langen Sequenz | Start einer 2 Byte langen Sequenz | Start einer 2 Byte langen Sequenz | Start einer 2 Byte langen Sequenz | Start einer 2 Byte langen Sequenz | Start einer 2 Byte langen Sequenz | Start einer 2 Byte langen Sequenz | Start einer 2 Byte langen Sequenz |
| D… | | | | Start einer 2 Byte langen Sequenz | Start einer 2 Byte langen Sequenz | Start einer 2 Byte langen Sequenz | Start einer 2 Byte langen Sequenz | Start einer 2 Byte langen Sequenz | Start einer 2 Byte langen Sequenz | Start einer 2 Byte langen Sequenz | Start einer 2 Byte langen Sequenz | Start einer 2 Byte langen Sequenz | Start einer 2 Byte langen Sequenz | Start einer 2 Byte langen Sequenz | Start einer 2 Byte langen Sequenz | Start einer 2 Byte langen Sequenz | Start einer 2 Byte langen Sequenz |
| E… | Start einer 3 Byte langen Sequenz | Start einer 3 Byte langen Sequenz | Start einer 3 Byte langen Sequenz | Start einer 3 Byte langen Sequenz | Start einer 3 Byte langen Sequenz | Start einer 3 Byte langen Sequenz | Start einer 3 Byte langen Sequenz | Start einer 3 Byte langen Sequenz | Start einer 3 Byte langen Sequenz | Start einer 3 Byte langen Sequenz | Start einer 3 Byte langen Sequenz | Start einer 3 Byte langen Sequenz | Start einer 3 Byte langen Sequenz | Start einer 3 Byte langen Sequenz | Start einer 3 Byte langen Sequenz | Start einer 3 Byte langen Sequenz |
| F… | Start einer 4 Byte langen Sequenz | Start einer 4 Byte langen Sequenz | Start einer 4 Byte langen Sequenz | Start einer 4 Byte langen Sequenz | Start einer 4 Byte langen Sequenz | | | | | | | | | | | |
| | …0 | …1 | …2 | …3 | …4 | …5 | …6 | …7 | …8 | …9 | …A | …B | …C | …D | …E | …F |

## Darstellung in Editoren

Wenn Daten mit einer anderen Kodierung (beispielsweise ISO-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 das Ersetzungszeichen � (U+FFFD, in UTF-8: EF,BF,BD) ersetzt.

### Umlaute und ß in deutschen Texten

Die Buchstaben des lateinischen Grundalphabets sowie die wichtigsten Satzzeichen werden in UTF-8 und ISO 8859 identisch angezeigt. Probleme mit der falsch gewählten Zeichencodierung treten bei den anderen Zeichen auf, beispielsweise bei Umlauten. In deutschsprachigen Texten treten diese Zeichen jedoch nur vereinzelt auf, sodass der Text zwar stark entstellt wirkt, aber meist noch lesbar bleibt.
UTF-8-Text mit anderem Encoding geöffnet: :
| Code | UTF-8 | UTF-8 | ISO 8859-1 | ISO 8859-15 | UTF16 |
| C3 84$_{hex}$ | U+00C4 | Ä | Ã | Ã | 쎄 |
| C3 96$_{hex}$ | U+00D6 | Ö | Ã | Ã | 쎖 |
| C3 9C$_{hex}$ | U+00DC | Ü | Ã | Ã | 쎜 |
| C3 9F$_{hex}$ | U+00DF | ß | Ã | Ã | 쎟 |
| C3 A4$_{hex}$ | U+00E4 | ä | Ã¤ | Ã€ | 쎤 |
| C3 B6$_{hex}$ | U+00F6 | ö | Ã¶ | Ã¶ | 쎶 |
| C3 BC$_{hex}$ | U+00FC | ü | Ã¼ | ÃŒ | 쎼 |
ISO-8859-Text mit UTF 8 geöffnet: :
| Code | ISO 8859-1/15 | UTF-8 |
| C4$_{hex}$ | Ä | Startbyte für U+0100 bis U+013F |
| D6$_{hex}$ | Ö | Startbyte für U+0580 bis U+013F |
| DC$_{hex}$ | Ü | Startbyte für U+0100 bis U+013F |
| DF$_{hex}$ | ß | Startbyte für U+0580 bis U+05BF |
| E4$_{hex}$ | ä | Startbyte für U+4000 bis U+4FFF |
| F6$_{hex}$ | ö | unzulässig |
| FC$_{hex}$ | ü | unzulässig |
In UTF-8 bestehen die Umlaute des deutschen Alphabets (sofern sie in der Normalform NFC vorliegen, also als precomposed character) und das ß aus zwei Bytes; nach ISO 8859 wird jedes dieser Zeichen als 1 Byte codiert und jedes Byte beim Lesen in ein Zeichen transformiert. Das in der UTF-8-Kodierung dieser Buchstaben gemeinsame erste Byte C3$_{hex}$ wird in den meisten ISO-8859-Varianten als Ã decodiert. Bei ÄÖÜß wird das zweite Byte nicht oder mit dem gleichen Fehler-Zeichen dargestellt, weil 7F$_{hex}$ bis 9F$_{hex}$ 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 Wort Hö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.

### Andere Sprachen

Bei anderen Sprachen, die das lateinische Alphabet verwenden (Französisch, Schwedisch, Kroatisch…) sind die Verhältnisse ähnlich. Texte mit nichtlateinischen Alphabeten (z. B. in ISO 8859-7 codierter griechischer Text) sind hingegen unlesbar, wenn sie als UTF-8 interpretiert werden.

### Byte Order Mark

Obwohl bei UTF-8 aufgrund der Art der Kodierung grundsätzlich nicht das Problem unterschiedlicher Bytereihenfolgen auftreten kann, fügen einige Programme eine Byte Order Mark (BOM, deutsch Bytereihenfolge-Markierung) am Dateianfang von UTF-8-Dateien ein. Die BOM besteht aus der Bytesequenz EF BB BF, die in nicht UTF-8-fähigen Texteditoren und Browsern meist als ISO-8859-1-Zeichenfolge ï»¿ erscheint und für Kompatibilitätsprobleme verantwortlich sein kann.

## Alternativen

Die Verarbeitung von UTF-8 als Multibyte-Zeichenfolge erfordert mehr Rechenzeit als Zeichenkodierungen mit fester Byteanzahl und ‑zuordnung, weil jedes Byte analysiert und ggf. konvertiert werden muss. Eine Kodierung ohne Konversion war UCS-2, das Microsoft 1993 mit Windows NT 3.1 einführte. Hier wurde jedes Zeichen ursprünglich fest mit zwei Bytes belegt, wodurch der ursprüngliche Unicode-Umfang von 65.535 Zeichen abdeckbar war, um den Preis eines erhöhten Speicherbedarfs (ungefähr Faktor 2 bei Englisch und westeuropäischen Sprachen). Da durch die spätere Weiterentwicklung von Unicode jedoch mit dieser Kodierung nicht mehr alle Zeichen darstellbar waren, erfolgte mit Windows 2000 ein neuerlicher Umstieg auf den kompatiblen Nachfolger UTF-16 Little Endian, womit man allerdings zugleich die Vorteile einer Kodierung mit fester Byteanzahl wieder verlor.