Hans Wittwer

Geschichten, die das Leben schrieb

Nachrichtentechnik

UTF-8 Format

Nachrichtentechnik - UTF-8 Format
← Unicode Bild codieren →

UTF-8 (8-Bit UCS Transformation Format) ist eine geniale Sache. UCS steht für Universal Coded Character Set.

UTF-8 ist kein Code oder doch irgendwie ein Code. UTF‑8 ist ein Umwandlungsformat und macht Unicode-Zeichen in Koexistenz mit dem reinen ASCII‑Code in der gleichen Datei transportierbar. UTF‑8 wurde erfunden um Unicode Zeichen so zu übertragen dass die Übertragung der ASCII-Zeichen in einem Byte weiterhin funktioniert. Es ist egal ob der Decoder UTF‑8 oder ASCII kann. Solange reine ASCII-Zeichen verschickt werden funktioniert es einwandfrei. Unzählige Anwendungen auf der ganzen Welt arbeiten mit reinem ASCII-Code und funktionieren damit unverändert tadellos weiter. Das ist nicht nur praktisch das ist genial.

Hersteller haben die Möglichkeit ihren Anwendungen schrittweise UTF-8 beizubringen, falls sie Zeichen ausserhalb vom ASCII‑Code korrekt verarbeiten und darstellen wollen.

Das UTF-8 Format erscheint im ersten Moment kompliziert und ist beim näheren Hinsehen genial.

Findige Köpfe grübelten also wie man Zeichen übertragen könnte sodass die Unicode-Zeichen übertragen werden können und die alten Anwendungen mit 1-Byte-Zeichen weiterhin funktionieren.

Gedankengang grob

Gedankengang detailliert

  1. Wenn das Byte mit 0 beginnt, ist es ein 1-Byte-Zeichen aus dem ASCII-Zeichensatz
    mit einer Nutzlast von 7 Bit ≙ 128 Zeichen.

  2. Wenn das Byte mit 10 beginnt, ist es ein Folgebyte aus einem Mehrbyte-Zeichen
    mit einer Nutzlast von 6 Bit (darf allein nicht vorkommen).

  3. Wenn das Byte mit 110 beginnt, ist es ein Kopf Byte mit einer Nutzlast von 5 Bit und hat 1 Folgebyte also ein 2-Byte Zeichen
    mit einer Nutzlast von (1 * 5 + 1 * 6) = 11 Bit ≙ 2'048 Zeichen.

  4. Wenn das Byte mit 1110 beginnt, ist es ein Kopf Byte mit einer Nutzlast von 4 Bit und hat 2 Folgebytes also ein 3-Byte Zeichen
    mit einer Nutzlast von (1 * 4 + 2 * 6) = 16 Bit ≙ 65'536 Zeichen (Ebene 0).

  5. Wenn das Byte mit 11110 beginnt, ist es ein Kopf Byte mit einer Nutzlast von 3 Bit und hat 3 Folgebytes also ein 4-Byte Zeichen
    mit einer Nutzlast von (1 * 3 + 3 * 6) = 21 Bit ≙ 2'097'152 Zeichen (32 Ebenen à 65'536 Zeichen davon 17 Ebenen ≙ 1'114'112 Zeichen.

Der einzige Wehrmutstropfen ist, dass in ASCII-Anwendungen bei Mehrbyte-UTF-8-Zeichen "falsche" Zeichen interpretiert werden, weil Kopf- und Folgebytes als ASCII-Zeichen interpretiert werden. Wenn ausschliesslich die 128 ASCII-Zeichen verwendet werden, gibts keine Mehrbytezeichen in der Datei und es klappt prima. Das Ziel war, dass alte Anwendungen den ASCII-Code senden und empfangen können ohne von UTF-8 etwas zu verstehen. Dieses Ziel hat man erreicht.

Dass man Dateien mit Mehrbyte-UTF-8-Zeichen an ASCII-Anwendungen verfüttert, war nie der Plan. Hingegen motivieren die Hieroglyphen die Erfinder ihre Anwendung UTF-8 kompatibel umzubauen.

Im April 2023 verwendeten 97.9% aller Websites UTF-8 und 98.8% der Top 1000. Quelle: Wikipedia

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. Quelle: Wikipedia

UTF-8

Anzahl Zeichen wie im Unicode: 1'114'112

Byte pro Zeichen E V N     Zeichen
1 01111111 0 1 7 27 = 128
2 11011111 10111111 0 5 11 211 = 2'048
3 11101111 10111111 10111111 0 8 16 216 = 65'536
4 11110000 10011111 10111111 10111111 1 11 21 216 = 65'536
4 11110100 10001111 10111111 10111111 16 11 21 216 = 65'536
Unicodezeichenraum (17 Ebenen) 17 x 216 = 1'114'112
davon heute 6 Ebenen definiert 6 x 216 = 393'216

Legende
E = Ebene
V = Verwaltungsbits
N = Nutz Bits
Zeichen = Zeichenzahl von Unicode (Nutzlast von UTF-8 nicht den Mehrbytewert).

Beim 1-Byte Zeichen existieren die Zeichen 128 - 255 nicht das erste Bit ist immer 0.
Wenn das erste Bit 1 ist, handelt es sich um eine Mehrbyte-Zeichen. Die Anzahl Einsen bis zur ersten 0 sagen aus wievielen Bytes das Zeichen besteht.

Denke daran! Wenn das Byte mit 10 beginnt ist es ein Folgebayte und NICHT ein 1 Byte Zeichen, 1 Byte Zeichen beginnen immer mit 0.

Bei 4-Byte Zeichen bestimmen die höchstwertigen 5 Byte die Ebene.

Mit Unicode sind 17 Ebenen (0 bis 24) à 65'536 Zeichen ≙ 1'114'112 Zeichen vorgesehen. Davon sind heute 6 Ebenen definiert ≙ 393'216 Zeichen. Die 11 übrigen Ebenen (720'896 Zeichen) sind vermutlich Reserve. Es hat noch Luft nach oben.

Unicode in HTML5 verwenden

Zeichen HTML5 Unicode UTF-8
Klartext Name Hex Dezimal Hex Binär Hex Binär
A A A A 0x41 0000 0000   0100 0001 0x41 0100 0001
© © © © 0xA9 0000 0000   1010 1001 0xC2 0xA9 1100 0010   1010 1001
¼ ¼ ¼ ¼ 0xBC 0000 0000   1011 1100 0xC2 0xBC 1100 0010   1011 1100
€ € € 0x20AC 0010 0000   1010 1100 0xE2 0x82 0xAC 11100010   1000 0010   1010 1100
🎤   🎤 &#127'908; 0x1F3A4 Viel Spass beim Grübeln 😂 🎤

Zusammenfassung

Ein Unicode-Zeichen umfasst 21 Bit. Ein Unicode-Zeichen wird im UTF-8 Format transportiert. Ein UTF-8 Zeichen hat 1 2 3 oder 4 Byte. Das Einzelbyte (ASCII-Code) beginnt mit 0. Mehrbyte-Zeichen haben ein Kopf Byte und 1 2 oder 3 Folge-Bytes. Ein Kopf Byte beginnt mit 110 1110 oder 11110. Folge-Bytes beginnen mit 10.

Byte beginnt mit Beschreibung
0 Einzelnes Byte. Identisch mit dem ASCII-Code.
10 Folge-Byte.
110 Startbyte mit einem Folge-Byte.
1110 Startbyte mit zwei Folge-Bytes.
11110 Startbyte mit vier Folge-Bytes.

Es ist praktisch während dem Lesen zu überprüfen ob die Reihenfolge Kopf- und Folgebyte kompatibel sind.

Byte Order Mark (BOM)

Eine UTF-8 Datei beginnt mit einer BOM (Byte Order Mark). Diese Signatur besteht aus drei Bytes (0xEF 0xBB 0xBF).

Wichtig ist zu wissen! Die BOM kann die Ursache für einen Bug sein. Hinterlistig ist, dass man die BOM in einem einfachen Editor nicht sieht. Systeme die UTF-8 erwarten könnten reklamieren wenn die BOM fehlt. Umgekehrt könnten Systeme die mit UTF-8 nichts am Hut haben stolpern wenn die BOM da ist. In der Regel interpretieren Systeme bei Dateien mit BOM gemäss UTF-8 und sonst gemäss ANSI.

← Unicode Bild codieren →
Nachrichtentechnik - UTF-8 Format