Zum Hauptinhalt springen

3. UTF-8-Definition (UTF-8 definition)

UTF-8 ist durch den Unicode-Standard [UNICODE] definiert. Beschreibungen und Formeln können auch in Anhang D von ISO/IEC 10646-1 [ISO.10646] gefunden werden.

Kodierungsbereich (Encoding Range)

In UTF-8 werden Zeichen im Bereich U+0000..U+10FFFF (der von UTF-16 erreichbare Bereich) unter Verwendung von Sequenzen von 1 bis 4 Bytes kodiert.

Ein-Byte-Sequenzen

Das einzige Byte einer Ein-Byte-„Sequenz" hat das höchstwertige Bit auf 0 gesetzt, wobei die verbleibenden 7 Bits zur Kodierung der Zeichennummer verwendet werden.

Mehrbyte-Sequenzen

In einer n-Byte-Sequenz, n>1:

  • Das initiale Byte hat die n höchstwertigen Bits auf 1 gesetzt, gefolgt von einem auf 0 gesetzten Bit
  • Die verbleibenden Bits dieses Bytes enthalten Bits der zu kodierenden Zeichennummer
  • Die nachfolgenden Bytes haben alle das höchstwertige Bit auf 1 und das nächste Bit auf 0 gesetzt, wobei 6 Bits in jedem übrig bleiben, um Bits des zu kodierenden Zeichens zu enthalten

Kodierungstabelle (Encoding Table)

Die folgende Tabelle fasst das Format dieser verschiedenen Byte-Typen zusammen. Der Buchstabe x zeigt Bits an, die zur Kodierung der Bits der Zeichennummer verfügbar sind.

Zeichennummern-      |        UTF-8-Byte-Sequenz
bereich | (binär)
(hexadezimal) |
--------------------+---------------------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

Kodierungsalgorithmus (Encoding Algorithm)

Die Kodierung eines Zeichens in UTF-8 läuft wie folgt ab:

Schritt 1: Anzahl der Bytes bestimmen

Bestimmen Sie die Anzahl der erforderlichen Bytes aus der Zeichennummer und der ersten Spalte der obigen Tabelle. Es ist wichtig zu beachten, dass die Zeilen der Tabelle sich gegenseitig ausschließen, d. h. es gibt nur eine gültige Möglichkeit, ein gegebenes Zeichen zu kodieren.

Schritt 2: Höchstwertige Bits vorbereiten

Bereiten Sie die höchstwertigen Bits der Bytes gemäß der zweiten Spalte der Tabelle vor.

Schritt 3: x-Bits füllen

Füllen Sie die mit x markierten Bits aus den Bits der Zeichennummer, ausgedrückt in binär. Beginnen Sie damit, das niederwertigste Bit der Zeichennummer in die niederwertigste Position des letzten Bytes der Sequenz zu setzen, dann setzen Sie das nächsthöhere Bit der Zeichennummer in die nächsthöhere Position dieses Bytes usw. Wenn die x-Bits des letzten Bytes gefüllt sind, gehen Sie zum vorletzten Byte über, dann zum vorherigen usw., bis alle x-Bits gefüllt sind.

Reservierte Zeichenbereiche (Reserved Character Ranges)

Die Definition von UTF-8 verbietet die Kodierung von Zeichennummern zwischen U+D800 und U+DFFF, die für die Verwendung mit der UTF-16-Kodierungsform (als Ersatzpaare) reserviert sind und keine Zeichen direkt darstellen.

Konvertierung von UTF-16

Bei der Kodierung in UTF-8 aus UTF-16-Daten ist es notwendig, zuerst die UTF-16-Daten zu dekodieren, um die Zeichennummern zu erhalten, die dann wie oben beschrieben in UTF-8 kodiert werden.

Vergleich mit CESU-8

Dies steht im Gegensatz zu CESU-8 [CESU-8], einer UTF-8-ähnlichen Kodierung, die nicht für die Verwendung im Internet vorgesehen ist. CESU-8 funktioniert ähnlich wie UTF-8, kodiert jedoch UTF-16-Codewerte (16-Bit-Größen) anstelle der Zeichennummer (Code Point). Dies führt zu unterschiedlichen Ergebnissen für Zeichennummern über 0xFFFF; die CESU-8-Kodierung dieser Zeichen ist KEIN gültiges UTF-8.

Dekodierungsalgorithmus (Decoding Algorithm)

Die Dekodierung eines UTF-8-Zeichens läuft wie folgt ab:

Schritt 1: Binärzahl initialisieren

Initialisieren Sie eine Binärzahl mit allen auf 0 gesetzten Bits. Bis zu 21 Bits können erforderlich sein.

Schritt 2: Zeichenbits bestimmen

Bestimmen Sie, welche Bits die Zeichennummer aus der Anzahl der Bytes in der Sequenz und der zweiten Spalte der obigen Tabelle kodieren (die mit x markierten Bits).

Schritt 3: Bits verteilen

Verteilen Sie die Bits aus der Sequenz in die Binärzahl, zuerst die niederwertigen Bits des letzten Bytes der Sequenz und gehen Sie nach links fort, bis keine x-Bits mehr übrig sind. Die Binärzahl entspricht nun der Zeichennummer.

Sicherheitsanforderung (Security Requirement)

Implementierungen des obigen Dekodierungsalgorithmus MÜSSEN (MUST) sich gegen die Dekodierung ungültiger Sequenzen schützen.

Beispiele für ungültige Sequenzen

Zum Beispiel könnte eine naive Implementierung:

  • Die überlange UTF-8-Sequenz C0 80 in das Zeichen U+0000 dekodieren
  • Das Ersatzpaar ED A1 8C ED BE B4 in U+233B4 dekodieren

Die Dekodierung ungültiger Sequenzen kann Sicherheitsfolgen haben oder andere Probleme verursachen. Siehe Sicherheitsüberlegungen (Abschnitt 10) unten.