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
- 0xxxxxxx ASCII-Zeichen kein Folgebyte.
- 10xxxxxx Folgebyte muss vorab ein Folgebyte oder ein Kopfbyte haben.
- 110xxxxx Kopfbyte 2-Byte-Zeichen anschliessend ein Folgebyte.
- 1110xxxx Kopfbyte 3-Byte-Zeichen anschliessend zwei Folgebyte.
- 11110xxx Kopfbyte 4-Byte-Zeichen anschliessend drei Folgebyte.
Gedankengang detailliert
- Wenn das Byte mit 0 beginnt, ist es ein 1-Byte-Zeichen aus
dem ASCII-Zeichensatz
mit einer Nutzlast von 7 Bit ≙ 128 Zeichen.
- Wenn das Byte mit 10 beginnt, ist es ein Folgebyte aus einem
Mehrbyte-Zeichen
mit einer Nutzlast von 6 Bit (darf allein nicht vorkommen).
- 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.
- 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).
- 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 |
| 🎤 | 🎤 | '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 | |
