Von ASCII bis UTF-8 im Detail
Unicode & UTF-8 im Speziellen
Ein einziger, riesiger Zeichensatz
In Teil 3 wurde dargelegt, dass Zeichensätze mit 256 Zeichen heute oft nicht mehr ausreichen.
Web-Experten mögen einwenden, dass es in ihrem Bereich einen Ausweg gibt,
nämlich sogenannte HTML-Entitäten. Dabei wird dann z.B. ein A-Umlaut (Ä)
durch die Sequenz Ä
dargestellt oder das
Delta-Zeichen (Δ) als Δ
. Das ist richtig,
aber es verlangt den Autoren einiges ab. Besser ist es, wenn man einfach
mit der Tastaturbelegung der Wahl schreiben kann. Zudem gibt es noch andere
Umgebungen als das Web, in denen Texte erfasst werden und wo es keine
HTML-Entitäten gibt.
Hier kommt also der Unicode-Zeichensatz als Lösung für die benannten Einschränkungen.
Der Unicode-Zeichensatz bietet folgendes:
-
Einen (einzigen) Zeichensatz, der weit über 100.000 Zeichen aus allen Sprachen der Welt durchnummeriert. Diese Nummern nennt man Unicode-Punkte, d.h. statt zu sagen »Unicode-Zeichen Nummer 65« spricht man von »Unicode-Punkt 65«.
Einschub:
Um zu verwirren (und aus guten Gründen, die hier nicht näher erläutert werden) benutzt man allerdings oft keine Dezimal-Zahlen, sondern Hexadezimal-Zahlen. Das tut aber nichts zur Sache und wird meist durch ein vorangestelltes »x« oder »0x« angedeutet. Für das Unicode-Zeichen mit der Nummer 65 sagen wir also eher »Unicode-Punkt 0x41« (41 ist der Hexadezimalwert zur Dezimalzahl 65). Für das Verständnis von Unicode muss man sich im Hexadezimalsystem aber nicht weiter auskennen. -
Verschiedene Methoden, all diese Zeichen in Zahlenwerte und damit letztendlich in Bitfolgen zu übersetzen. Wir werden gleich sehen, warum die Unicode-Punkte (die ja eine Nummerierung, also bereits Zahlen sind) nochmal in Kodierungen umgewandelt werden müssen.
Besagte Zahlenwerte
Unicode-Zeichenkodierungen
Einen Zeichensatz zu definieren ist eine Sache. Damit man diesen in der Informationstechnik verarbeiten kann, muss man für jedes Zeichen eine Kodierung angeben: Welches elektronische Signal (welcher Zahlenwert oder welche Reihe von Zahlenwerten) soll für welches Zeichen (Unicode-Punkt) stehen?
Die erste Idee mag sein: Man kann doch einfach die jeweilige Nummer im Unicode-Zeichensatz verwenden. Leider ist es nicht so einfach. Nehmen wir zum Beispiel eine Zahlenfolge »65 65« (»0x41 0x41«). Damit könnte zweimal der Buchstabe A gemeint sein (Unicode-Punkt 0x41, d.h. 65) oder aber das koreanische Zeichen am Unicode-Punkt 0x4141. Es gibt verschiedene Ansätze, um dieses und andere Probleme zu lösen. Diesen entsprechend, sieht Unicode mehrere Kodierungen vor.
Da der Sinn von Unicode ist, viel mehr als 256 Zeichen abbilden zu können, reicht ein Byte (also acht Bit) pro Zeichen nicht aus, weil ein Byte ja nur 256 verschiedene Werte (0 bis 255) darstellen kann.
Die offensichtliche Lösung ist hier: Wir kodieren jedes Zeichen in mehreren Byte. Zum Beispiel kann man mit zwei Byte, also 16 Bit, 65.536 verschiedene Zahlenwerte kombinieren. Damit lassen sich dann ebenso viele Zeichen kodieren. In vier Byte ließen sich sogar über 4 Millionen Zeichen kodieren.
Das hat aber zwei Nachteile:
-
Erstens werden die Dateien größer. Wenn für jedes Zeichen zwei (oder sogar vier) Byte verwendet werden, wird die Datei nun mal doppelt (viermal) so viele Byte haben wie bei einer einfachen herkömmlichen Ein-Byte-Kodierung (z.B. ASCII).
-
Zweitens sind diese Kodierungen nicht mehr mit der ASCII-Kodierung kompatibel: Selbst, wenn man den Buchstaben A auch hier durch die Zahl 65 darstellen will, kann man das zweite Byte für dieses Zeichen nicht einfach auslassen. Stattdessen fügt man eine Null (bzw. bei vier Byte pro Zeichen drei Nullen) ein, damit alle Zeichen die gleiche Länge (Anzahl an Bytes) einnehmen. Sonst könnte die Software zum Lesen der Datei ja nicht wissen, wo ein Zeichen aufhört und das nächste beginnt.
Dennoch gibt es solche Kodierungen und auf der nächsten Seite sind diese auch kurz beschrieben. Im Wesentlichen wollen wir uns aber mit der wohl elegantesten Unicode-Zeichenkodierung, UTF‑8, beschäftigen.
UTF steht für Unicode Transformation Format und bezeichnet eine Gruppe von Kodierungen für den Unicode-Zeichensatz. Während einige UTF-Kodierungen mit festen Bytelängen der Werte arbeiten, arbeitet UTF‑8 anders: Die Basis-Zeichen aus dem ASCII-Zeichensatz werden exakt wie bei ASCII, also mit einem Byte pro Zeichen, kodiert. Darüber hinaus gibt es Zeichen, die in zwei oder mehr Bytes kodiert werden. Wenn man es mal weiß, scheint es verblüffend einfach.
Schauen wir auf den nächsten Seiten kurz in die Mehr-Byte-Kodierungen und die Lösung der von diesen aufgeworfenen Problemen, UTF‑8.