Hans Wittwer

Geschichten, die das Leben schrieb

Nachrichtentechnik

UTF-8 Format

🏁

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. Damit können sogar die bestehenden Transportsysteme unverändert weiterverwendet werden. 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 des ASCII-Codes 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 Unicode-Zeichen übertragen werden 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; Reines 7-Bit ASCII-Zeichen
    mit einer Nutzlast von 7 Bit ≙ 128 Zeichen.

  2. Wenn das Byte mit 10 beginnt, ist es ein Folge-Byte mit einer Nutzlast von 6 Bit und darf allein nicht vorkommen.

  3. Wenn das Byte mit 110 beginnt, ist es ein Start-Byte eines 2-Byte Zeichens, hat ein Folge-Byte und die Nutzlast von 11 Bit ≙ 2'048 Zeichen.

  4. Wenn das Byte mit 1110 beginnt, ist es ein Start-Byte eines 3-Byte Zeichens, hat zwei Folge-Bytes und die Nutzlast von 16 Bit ≙ 65'536 Zeichen (Ebene 0).

  5. Wenn das Byte mit 11110 beginnt, ist es ein Start-Byte eines 4-Byte Zeichens, hat drei Folge-Bytes und die Nutzlast von 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 Start- und Folge-Bytes 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 0 1 7 27=128
2 0 5 11 211=2'048
3 0 8 16 216=65'536
4 1 11 21 216=65'536
4 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 = Anzahl Unicode Zeichen.

Beim 1-Byte Zeichen existieren die Bytewerte 0-127, identisch mit dem ASCII-Code.
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 Folge-Byte 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. Ein Zeichen aus Ebene 0 braucht maximal 3 Byte.

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.

Unicode in HTML verwenden

Zeichen HTML Unicode UTF-8
  Name DEC HEX BIN HEX BIN HEX
A A A A 01000001 0x41 01000001 0x41
© © © © 10101001 0xA9 11000010 10101001 0xC2 0xA9
¼ ¼ ¼ ¼ 10111100 0xBC 11000010 10111100 0xC2 0xBC
€ € € 00100000 10101100 0x20AC 11100010 10000010 10101100 0xE2 0x82 0xAC
🎤   &#127'908; 🎤 00001 11110011 10100100 0x1F3A4 11110000 10011111 10001110 10100100 0xF0 0x9F 0x8E 0xA4

Zusammenfassung

Ein Unicode-Zeichen umfasst maximal 21 Bit. Solange ein Unicodezeichen in Ebene 0 ist, nur 16-Bit. Ein ASCII-Zeichen nur 8 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 Start-Byte und 1 2 oder 3 Folge-Bytes. Ein Start-Byte beginnt mit 110 (2-Byte) 1110 (3-Byte) oder 11110 (4-Byte). Folge-Bytes beginnen mit 10.

Ein 1, 2 oder 3-Byte UTF-8-Zeichen ist immer aus der Unicode-Ebene 0. Das 4te UTF-8-Byte kommt nur zum Einsatz, wenn das Unicode-Zeichen nicht aus Unicode-Ebene 0 stammt.

Byte beginnt mit Beschreibung
0 Einzelnes Byte. Identisch mit dem ASCII-Code.
10 Folge-Byte. Darf allein nicht vorkommen.
110 Startbyte mit einem Folge-Byte.
1110 Startbyte mit zwei Folge-Bytes.
11110 Startbyte mit drei Folge-Bytes.

Es ist praktisch während dem Lesen zu überprüfen ob die Reihenfolge Start- und Folge-Byte(s) 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. Achtung! Neuerdings erwarten heute Systeme Daten im UTF-8-Format ausdrücklich ohne BOM, also schon wieder eine Art Scheibenschiessen im Dunkeln, lassen wir uns überraschen …

Und nun ein Bild codieren