Von ASCII bis UTF-8 im Detail

UTF-8-Zeichenkodierung

Prinzip

Das Prinzip geht so: Die „normalen Zeichen” werden durch ein Byte dargestellt und die „ausgefalleneren” durch mehrere Bytes.

Die Zeichen des ASCII-Kodes werden exakt wie bei ASCII (und praktisch allen klassischen Kodierungen wie Latin‑1 etc.) mittels eines einzelnen Bytes dargestellt. Die Werte dieser Zeichen entsprechen genau dem ASCII-Standard. Damit kann ein Programm, welches UTF‑8 verarbeitet, auch ganz normale ASCII-Dateien und -Zeichenketten lesen und schreiben. Wir sind also voll ASCII-kompatibel.

Wieviel Byte gelten diesem Zeichen?

Wenn manche Zeichen durch ein Byte, andere durch zwei oder mehr Byte repräsentiert werden, muss ein Programm zur Datenverarbeitung bestimmen können, wann ein Zeichen endet und ein neues anfängt. Dazu benutzt UTF‑8 folgenden Algorithmus:

Einschub für Detailverliebte und Binär-Liebhaber:
Die Kodierung verwendet hinter den Kulissen noch ein paar weitere Regeln, um das ganze robust zu machen. Während die Start-Bytes, entsprechend der oben angegebenen Zahlenwerte, mit den Binärsquenzen 0, 110, 1110 oder 11110 (für 1-, 2-, 3-, 4-Byte-Zeichen) beginnen, haben Folge-Bytes immer die Binärsequenz 10 an ihrem Anfang. So sind nicht nur die Bereiche einfach nachvollziehbar abgegrenzt, sondern man weiß von einem Byte stets, ob es der Anfang eines Zeichens oder ein Folgebyte ist.

Entsprechend braucht UTF-8 nur für spezielle Zeichen außerhalb des ASCII-Zeichensatzes mehrere Bytes. Ein Text mit 1000 Buchstaben des englischen Alphabets, wird genau 1000 Bytes vereinnahmen. Kommt darin ein einzelnes Zwei-Byte-Zeichen vor (nehmen wir das scharfe S), so wird der Text 1001 Byte lang sein: 999 Zeichen werden durch je ein Byte dargestellt und für das scharfe S werden zwei benötigt.

Zum Vergleich wäre die gleiche Datei bei UTF-16-Kodierung jeweils 2000 Byte groß - davon 1000 bzw. 999 Nullen. Bei UTF‑32 wären es sogar 4000 Byte, wovon wiederum 3000 bzw. 2999 Stellen nur durch Nullen gefüllt wären.

Vorteile

Jetzt mal konkret und anschaulich

Mit meinem kleinen Textinspector kann man sich für einen kurzen Text anzeigen lassen, welche Unicode-Punkte er enthält und wie diese in UTF-8 kodiert werden.

Das sollte dann auch vor Augen führen, dass es bei Zeichen verschiedene Aspekte gibt, die voneinander zu unterscheiden sind. Um zu zeigen, dass Unicode erweiterbar ist, betrachten wir mal ein relativ junges Zeichen, nämlich das scharfe S als Großbuchstaben. Bereits 2008 - neun Jahre, bevor der Rat für Deutsche Rechtschreibung sich auf die Einführung des großen scharfen S einigen konnte - hat das Unicode-Consortium den Buchstaben bereits kodiert.

Wir haben jetzt also folgende Aspekte, die man fein auseinanderhalten muss:

Damit sind die wichtigsten Punkte zum Thema Unicode im Allgemeinen und UTF-8 im Speziellen dargelegt. Im folgenden Teil 8 wird noch kurz auf die Byte-Order-Mark eingegangen, die aber in vielen Bereichen (z.B. im Web) höchstens als Fehlerquelle auftritt.

Teil 6 ←→ Teil 8

© Hermann Faß, 2013