34 Punkte von GN⁺ 2025-09-13 | Noch keine Kommentare. | Auf WhatsApp teilen
  • 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.

Noch keine Kommentare.