Von ASCII bis UTF-8 im Detail

Einfache Mehr-Byte-Zeichenkodierungen

Zweck und Anwendbarkeit

Wir haben in Teil 3 gesehen, dass umfangreiche Zeichensätze mit einer strikten Zuordnung von einem Byte pro Zeichen nicht auskommen. Nun ist es ja aber kein Muss, dass nur ein Byte verwendet wird, um ein Zeichen zu übertragen. Man kann ja auch einen Standard definieren, bei dem pro Zeichen zwei Bytes verwendet werden. Dann werden die Text-Dateien oder Datenmengen zwar doppelt so groß, aber man bekommt in diesem Zeichensatz wesentlich mehr Zeichen unter. Jeder der 256 Werte, die das erste Byte annehmen kann, kann mit jedem der Werte, die das zweite Byte annehmen kann, kombiniert werden. Daraus ergeben sich 256 x 256 = 65536 verschiedene Werte.

Wichtig ist nur, dass das Gerät oder Programm, mit dem die Information gelesen wird, auch versteht, welches Zeichen sich z.B. mit dem Wert 12380 gemeint ist. Solange Sender (z.B. Editor) und Empfänger (z.B. Browser) die gleiche Kodierung unterstützen ist es egal wie diese aufgebaut ist.

Standards

Zeichenkodierungen mit zwei Bytes pro Zeichen gibt es, und zwar heißen sie UCS‑2 (die 2 steht für zwei Bytes pro Zeichen) und UTF‑16 (hier steht die 16 steht für 16 Bit, was wiederum der Länge von zwei Bytes entspricht). UTF‑16 gibt es in zwei Varianten, UTF‑16LE und UTF‑16BE, was uns aber hier nicht interessiert.

Nachteile (Motivation zur Weiterentwicklung zu UTF‑8)

Mit diesen auf zwei Bytes pro Zeichen basierenden Kodierungen werden die Dateien bzw. die im Netzwerk zu übertragenden Zeichenketten (Email etc.) doppelt so groß wie in den klassischen Koderiungen. Im Gegenzug hat man aber keine Probleme mit dem scharfen S oder dem griechischen Alphabet.

Das größere Datenvolumen ist ein Nachteil, aber es gibt noch einen: Wer glaubt, 65536 verschiedenen Zeichen müssten doch für alle Sprachen und Sonderzeichen ausreichen, hat vielleicht die Schriftzeichen der asiatischen Sprachen sowie etliche (für manche Leute) sehr nützliche Sonderzeichen und graphische Symbole vergessen.

Aber es gibt auch noch UTF‑32, in welchem für jedes Zeichen ganze vier Bytes zur Kodierung benutzt werden. Daraus ergeben sich Milliarden möglicher Zeichen. Nur werden die Dateien oder zu übertragenden Zeichenketten gleich gleich viermal so groß als bei klassischen Ein-Byte-Kodierungen. Dabei ist es egal, ob es sich um einen chinesischen Text oder um einen englischen Text ohne besondere Zeichen handelt: Jedes Zeichen kostet vier Bytes.

Kodierungen, bei denen jedes Zeichen durch mehrere Bytes dargestellt wird, vergrößern die Datenmengen also unnötigerweise.

Ein weiterer Nachteil von UTF‑16 und UTF‑32 ist, dass sie nicht kompatibel mit älteren Kodierungen sind. Während bei den Klassikern die ersten 127 Zeichen immer gleich waren, bestehen auch diese ja jetzt aus zwei bzw. vier Bytes.

UTF-8 als Lösung

Ken Thompson und Rob Pike haben alle obengenannten Nachteile für uns bereits 1992 gelöst, indem sie UTF‑8 erfunden haben. Dies wird nun im nächsten Teil beschrieben.

Teil 5 ←→ Teil 7

© Hermann Faß, 2013