- UTF-8 ist eine Encoding mit variabler Länge, die Millionen von Zeichen darstellen kann und zugleich abwärtskompatibel zu ASCII bleibt
- Der gleiche 7-Bit-Bereich wie bei ASCII (
U+0000~U+007F) wird unverändert als 1 Byte verwendet, sodass eine ASCII-Datei zugleich eine gültige UTF-8-Datei ist
- Alle anderen Zeichen werden als 2- bis 4-Byte-Sequenzen dargestellt; das Bitmuster des führenden Bytes definiert die Länge, und die folgenden Bytes beginnen mit
10, um sie als Fortsetzungsbytes zu kennzeichnen
- Dank dieses Designs kann UTF-8 einen universellen Zeichensatz verarbeiten und bleibt gleichzeitig vollständig kompatibel mit bestehenden ASCII-Systemen, weshalb es die am weitesten verbreitete Zeichenkodierung wurde
- Andere Unicode-Kodierungen wie UTF-16 und UTF-32 bieten diese ASCII-Kompatibilität nicht
Die Genialität des UTF-8-Designs
- Als ich UTF-8 zum ersten Mal kennengelernt habe, hat mich die Struktur, die mit bestehendem ASCII kompatibel bleibt, obwohl sie Millionen unterschiedlicher Zeichen aus verschiedenen Sprachen in einem System zusammenführt, tief beeindruckt
- Grundsätzlich nutzt UTF-8 bis zu 32 Bit, während ASCII nur 7 Bit verwendet
- Die Designprinzipien von UTF-8 sind wie folgt
- Jede in ASCII kodierte Datei ist eine gültige UTF-8-Datei
- Jede UTF-8-Datei, die nur ASCII-Zeichen enthält, ist eine gültige ASCII-Datei
- Die Idee, ein veraltetes System mit nur 128 Zeichen mit einem System für Millionen von Zeichen zu verbinden, ist ausgesprochen innovativ
Grundkonzept von UTF-8
- UTF-8 ist eine Zeichenkodierung mit variabler Länge (variable-width encoding), die dafür entworfen wurde, alle Zeichen des Unicode-Zeichensatzes darzustellen
- Jedes Zeichen wird mit 1 bis 4 Bytes kodiert
- Die ersten 128 Zeichen (
U+0000~U+007F) werden als einzelnes Byte gespeichert und sichern damit die Abwärtskompatibilität zu ASCII
- Alle anderen Zeichen werden mit zwei, drei oder vier Bytes kodiert
- Die führenden Bits des ersten Bytes bestimmen die insgesamt benötigte Anzahl an Bytes für die Kodierung
| 1-Byte-Muster |
Anzahl Bytes |
Muster der gesamten Byte-Sequenz |
| 0xxxxxxx |
1 |
0xxxxxxx (normales ASCII) |
| 110xxxxx |
2 |
110xxxxx 10xxxxxx |
| 1110xxxx |
3 |
1110xxxx 10xxxxxx 10xxxxxx |
| 11110xxx |
4 |
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
- Das 2., 3. und 4. Byte einer Mehrbyte-Sequenz beginnt immer mit
10, was Fortsetzungsbytes eindeutig markiert
- Die restlichen Bits von Hauptbyte und Fortsetzungsbytes werden kombiniert, um einen Code Point zu bilden
- Ein Code Point ist eine eindeutige Unicode-Zeichenkennung und wird mit dem Präfix "U+" sowie hexadezimal dargestellt
- Beispiel: Der Code Point von "A" ist
U+0041
- Der Ablauf zur Interpretation von Zeichen aus UTF-8-kodierten Bytes ist wie folgt
- 1. Ein Byte lesen; wenn es mit 0 beginnt, wird es als Einzelbyte-Zeichen (ASCII) behandelt, das Zeichen mit den restlichen 7 Bits dargestellt und dann zum nächsten Byte übergegangen
- 2. Falls nicht 0, dann
- bei 110: ein 2-Byte-Zeichen, also ein weiteres Byte lesen
- bei 1110: ein 3-Byte-Zeichen, also die nächsten 2 Bytes lesen
- bei 11110: ein 4-Byte-Zeichen, also 3 weitere Bytes lesen
- 3. Aus den bestimmten Bytes die restlichen Bits ohne die führenden Bits kombinieren und als Binärwert des Code Points verwenden
- 4. Den Code Point im Unicode-Zeichensatz nachschlagen und auf dem Bildschirm darstellen
- 5. Mit dem nächsten Byte wiederholen
Beispiel: das Hindi-Zeichen "अ"
- UTF-8-Darstellung:
11100000 10100100 10000101 (3 Bytes)
- Erstes Byte (
11100000) → zeigt an, dass es sich um ein 3-Byte-Zeichen handelt
- Kombination der Nutzbits aus den drei Bytes →
00001001 00000101 = hexadezimal 0x0905
- Der Code Point
U+0905 steht für das Devanagari-Zeichen "अ"
Dateibeispiele
-
1. Hey👋 Buddy
- Besteht aus insgesamt 13 Bytes
- ASCII-Zeichen (H, e, y, B, u, d, d, y, Leerzeichen) → jeweils 1 Byte
- 👋 (U+1F44B) → 4 Bytes
11110000 10011111 10010001 10001011
- Diese Datei ist eine gültige UTF-8-Datei, aber da sie ein Nicht-ASCII-Zeichen (Emoji) enthält, ist sie nicht ASCII-kompatibel
-
2. Hey Buddy
- Insgesamt 9 Bytes, alle im ASCII-Bereich
- Daher ist diese Datei zugleich eine gültige ASCII-Datei und eine gültige UTF-8-Datei
Vergleich mit anderen Kodierungen
- Es gibt einige Kodierungen, die Kompatibilität zu ASCII bieten, sie sind aber nicht so weit verbreitet wie UTF-8
- Auch GB18030 (chinesischer Standard) bietet ASCII-Kompatibilität, wird jedoch nicht so breit genutzt
- Die ISO/IEC-8859-Familie ist auf Erweiterungen mit einem einzelnen Byte (maximal 256 Zeichen) beschränkt und hat daher Grenzen
- UTF-16/UTF-32 sind nicht ASCII-kompatibel
- 'A' (U+0041): In UTF-16
00 41, in UTF-32 00 00 00 41
Bonus: UTF-8 Playground
Noch keine Kommentare.