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.[1]
UTF-8 ist in den ersten 128 Zeichen (Indizes 0–127) deckungsgleich mit ASCII und eignet sich mit in der Regel nur einem Byte Speicherbedarf für Zeichen vieler westlicher Sprachen, besonders für die Kodierung englischsprachiger Texte, die sich im Regelfall ohne Modifikation daher sogar mit nicht-UTF-8-fähigen Texteditoren ohne Beeinträchtigung bearbeiten lassen, was einen der Gründe für den Status als De-facto-Standard-Zeichenkodierung des Internet und damit verbundener Dokumenttypen darstellt. Im April 2023 verwendeten 97,9 % aller Websites UTF-8[2] und 98,8 % der Top 1000.[3]
In anderen Sprachen ist der Speicherbedarf in Bytes pro Zeichen größer, wenn diese vom ASCII-Zeichensatz abweichen. Die deutschen Umlaute und das ß (scharfe S) erfordern zwei Bytes, machen aber nur einen kleinen Teil deutscher Texte aus. Ähnlich ist es bei anderen Sprachen wie beispielsweise Französisch, welche überwiegend die lateinischen Buchstaben aus dem ASCII-Raum verwenden. Griechische oder kyrillische Buchstaben belegen hingegen ebenfalls 2 Bytes, allerdings bestehen daraus praktisch die kompletten Texte abgesehen von Leerzeichen, Satzzeichen und Ziffern. Zeichen fernöstlicher Sprachen und von Sprachen aus dem afrikanischen Raum belegen sogar bis zu 4 Bytes je Zeichen.
Da die Verarbeitung von UTF-8 als Multibyte-Zeichenfolge wegen der notwendigen Analyse jedes Bytes im Vergleich zu Zeichenkodierungen mit fester Byteanzahl je Zeichen mehr Rechenaufwand und für bestimmte Sprachen auch mehr Speicherplatz erfordert, werden abhängig vom Einsatzszenario auch andere UTF-Kodierungen zur Abbildung von Unicode-Zeichensätzen verwendet. So führte Microsoft 1993 mit Windows NT 3.1 die Verwendung von UCS-2 ein, einer Zeichenkodierung, bei der jedes Zeichen fest zwei Bytes belegt. 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.[4]
Bei der UTF-8-Kodierung wird jedem Unicode-Zeichen eine speziell kodierte Zeichenkette variabler Länge zugeordnet. Dabei unterstützt UTF-8 Zeichenketten bis zu einer Länge von vier Byte, auf die sich – wie bei allen UTF-Formaten – alle Unicode-Zeichen abbilden lassen.
UTF-8 hat zentrale Bedeutung als globale Zeichenkodierung im Internet. 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.[5]
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.[6]
UTF-8 ist von der IETF, dem Unicode-Konsortium und der ISO gegenwärtig identisch definiert in den Normdokumenten:
Diese lösen ältere, teilweise abweichende Definitionen ab, die teilweise noch von älterer Software benutzt werden:
Unicode-Zeichen mit 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. Daher sind alle Daten, für die ausschließlich ASCII-Zeichen verwendet werden, in beiden Darstellungen identisch.
Unicode-Zeichen größer als 127 werden in der UTF-8-Kodierung zu 2 bis 4 Byte langen Bytefolgen.
c4…0b7…0a7…0 steht für das zu kodierende max. 21 Bit lange Zeichen. Die Anzahl der Einsen 1 vor der ersten Null 0 im ersten Byte ist gleich der Gesamtzahl der Bytes für das Zeichen.
Der Algorithmus lässt theoretisch längere Bytesequenzen zu. Ursprünglich wurde eine Folge aus einem ersten Byte mit bis zu 1111110x (FChex und FDhex) und fünf Folge-Bytes der Form 10xxxxxx 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 0 bis 0010 FFFF (1.114.112 Möglichkeiten) und weist maximal vier Bytes lange Byteketten auf. Der damit verfügbare Wertebereich für den Zeichencode wird letztlich nicht vollständig benutzt. Entsprechend lange Bytefolgen und große Werte gelten heute als unzulässige Codes und sind entsprechend zu behandeln.
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.
Zu beachten:
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.
110000
13FFFF
140000
In folgender Tabelle sind einige Kodierungsbeispiele für UTF-8 angegeben:
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.
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.
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.
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 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 C3hex wird, wie der Tabelle zu entnehmen ist, jeweils unterschiedlich decodiert, ebenso das weitere Byte der Codierung von äöü, dagegen wird bei ÄÖÜß das zweite Byte nicht oder mit dem gleichen Fehler-Zeichen dargestellt, weil 7Fhex bis 9Fhex in ISO 8859 nicht definiert sind, was die Lesbarkeit des Textes zusätzlich erschwert.
Bei der Interpretation eines in ISO-8859-codierten Textes als UTF-8 führen die Buchstaben öü zur Anzeige eines Ersetzungszeichens, weil der entsprechende Byte-Wert, wie der Tabelle unten zu entnehmen ist, 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 häufig, weil die Codierungen der meisten Buchstaben keine gültigen Folgebytes sind. Bei einem ä wird sogar versucht, die nächsten beiden Bytes als Folgebyte 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:
Lokasi Pengunjung: 3.137.218.97