Unicode

Die Lösung aller oben beschriebenen Probleme heißt: Unicode (wird von seinen Freunden ISO/IEC 10646 genannt). Dahinter steckt eine recht simple Idee: statt die völlig unzureichende Größe von 255 maximal möglichen darstellbaren Zeichen aufrechtzuerhalten, schöpft man aus dem vollen und weist jedem Zeichen auf dieser Welt seinen eigenen eindeutigen Code (das heißt in diesem Fall: eine eindeutige Zahl) zu. Damit können griechische und russische Zeichen friedlich vereint im selben Brief koexistieren und auch Ølga's liebevoll verfasstes Gedicht
Sillgrisslan är den fågel i Sverige som i genomsnitt blir äldst
wird nicht zu einem babylonischen Sprachgewirr, wenn es versehentlich in Athen als
Sillgrisslan δr den fεgel i Sverige som i genomsnitt blir δldst
interpretiert und angezeigt wird.

Na, das war doch einfach, da hätten die Herren Computerwissenschaftler ja auch gleich drauf kommen können. Das Problem ist gelöst: alle steigen auf Unicode um und alle Sorgen gehören der Vergangenheit an. Das ist im Prinzip richtig, die Sache hat jedoch einen winzigen Haken: die eindeutigen Zahlen, die den einzelnen Zeichen aller Sprachen dieser Welt zugeordnet werden, lassen sich auf gar keinen Fall innerhalb eines Bytes darstellen. Genau genommen legt der Unicode Standard nicht fest, wie diese Zahlen im Computer zu repräsentieren sind, er besagt nur, welche Zeichen welcher Zahl zugeordnet werden.

Die ersten 256 Unicode Zeichen
…0 …1 …2 …3 …4 …5 …6 …7 …8 …9 …A …B …C …D …E …F
0… NUL SOH STX ETX EOT ENQ ACK BEL BS HT LF VT FF CR SO SI
1… DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US
2… SP ! " # $ % & ' ( ) * + , - . /
3… 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
4… @ A B C D E F G H I J K L M N O
5… P Q R S T U V W X Y Z [ \ ] ^ _
6… ` a b c d e f g h i j k l m n o
7… p q r s t u v w x y z { | } ~ DEL
8… XXX XXX BPH NBH IND NEL SSA ESA HTS HTJ VTS PLD PLU RI SS2 SS3
9… DCS PU1 PU2 STS CCH MW SPA EPA SOS XXX SCI CSI ST OSC PM APC
A… NBSP ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ SHY ® ¯
B… ° ± ² ³ ´ µ · ¸ ¹ º » ¼ ½ ¾ ¿
C… À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï
D… Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß
E… à á â ã ä å æ ç è é ê ë ì í î ï
F… ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ

Die Darstellung der Unicode-Zahlen (die auch Codepunkte genannt werden) im Computer heißt auch Kodierung, und es gibt dafür verschiedene Möglichkeiten, die für unterschiedliche Einsatzzwecke besser oder schlechter geeignet sind. Gemeinsam ist ihnen allen, dass sie ein Zeichen (einen Buchstaben) gegebenenfalls mit mehr als einem Byte kodieren. Die vielleicht naheliegendste Möglichkeit wäre, einfach für ein Zeichen die duale Darstellung der Zahl zu wählen, die diesem vom Unicode Standard zugewiesen wird. Um zu gewährleisten, dass die Darstellung eindeutig ist, muss man sich dann aber auf eine feste Größe für die Kodierung eines Zeichens festlegen, und da im schlechtesten Fall die Binärdarstellung einer Unicode Zahl 4 Bytes benötigt, kann man keine kleinere Darstellung wählen.

Das hat einen entscheidenden Nachteil: alle Texte (auch diejenigen, die tatsächlich nur ASCII Zeichen enthalten), werden auf die vierfache Größe aufgebläht. Das ist ein sehr unschöner Nebeneffekt, auch wenn Speicher immer billiger wird. Das zugehörige Encoding wird UTF-32 genannt und benötigt, wie gesagt 4 Byte für jedes Zeichen. Es gibt aber auch wesentlich sparsamere Kodierungen: durch eine geschickte Wahl des Kodierungsalgorithnmus benötigt UTF-8 lediglich 1 Byte für ASCII-Zeichen und zwischen 2 und 4 Byte für alle anderen Zeichen der Welt. Für Schriften, die auf dem lateinischen Alphabet beruhen, ist UTF-8 die sparsamste Methode, Unicode Zeichen darzustellen. Der Vollständigkeit halber soll auch noch UTF-16 erwähnt werden, das mindestens zwei, maximal jedoch 4 Byte benötigt. Siehe hierzu auch die Website des Unicode Konsortiums.

Wie sieht nun beispielsweise die Kodierung eines Buchstabens in unseren unterschiedlichen Repräsentationsformen aus? In der folgenden Tabelle kann man die Unterschiede zwischen den verschiedenen Kodierungen sehen, insbesondere bleibt festzuhalten, dass Sonderzeichen jeweils unterschiedlich umgesetzt werden.

Darstellungsformen
Unicode
hex
ASCII
hex
ASCII
binär
ISO-8859-1
hex
ISO-8859-1
binär
UTF-8
hex
UTF-8
binär
UTF-16
hex
UTF-16
binär
a 61 61 0110 0001 61 0110 0001 61 0110 0001 00 41 0000 0000
0100 0001
ä e4 -- -- e4 1110 0100 c3 a4 1100 0011
1010 0100
00 e4 0000 0000
1110 0100
© a9 -- -- a9 1010 1001 c4 a9 1100 0010
1010 1001
00 a9 0000 0000
1010 1001
Π 03 a0 -- -- -- -- ce a0 1100 1110
1010 0000
03 a0 0000 0011
1010 0000

Leider haben alle Kodierungsmöglichkeiten für Unicode eines gemeinsam: sie sind unverträglich mit den ISO-8859-x Standards und sie benötigen alle mehr als 1 Byte zur Codierung eines Buchstaben. Das ist natürlich eine Tatsache, die sich nicht umgehen lässt. Schließlich bietet ein Byte Platz für maximal 256 verschiedene Bitkombinationen, man braucht also nicht darauf zu warten, dass eine noch effektivere Kodierung für Unicode gefunden wird. Somit stellt der Umstieg Benutzer und Programmierer gleichermaßen vor Probleme.

Der Benutzer stand, kurz nachdem Unicode Einzug in die Informatik gehalten hatte und zum Teil bis heute, zunächst erstaunlicherweise vor demselben Problem wie vorher: ein Bekannter schickte eine Nachricht und die Sonderzeichen waren entstellt. Schlimmer noch: waren es vorher lediglich die Texte aus dem Ausland gewesen, die teilweise verunstaltet waren, kamen jetzt noch die Briefe vom Kollegen dazu, obwohl der doch eigentlich dieselben Sonderzeichen benutzt, die auch früher immer korrekt dargestellt wurden. Auf Nachfrage ergab sich dann, dass der Kollege die von ihm verschickten Dokumente einwandfrei lesen konnte, seinerseits aber Probleme mit den Texten des Benutzers hatte. Was hatten sich die Herren Software-Entwickler dabei nur wieder gedacht?

Hinzu kam, dass es sogar möglich war, versehentlich einen Brief in einen Zustand zu bringen, in dem keine der beiden beteiligten Parteien den Text noch fehlerfrei lesen konnte. Und so beschlossen viele Leute erstmal lieber mit dem Manko der verschiedenen ISO-8859-x Kodierungen zu leben, weil die Probleme damit scheinbar geringer waren.

Wohlgemerkt: diese Probleme waren eine Folge der Tatsache, dass sich mit den ISO-8859-x Standards eine bestimmte unzulängliche Art etabliert hatte, wie Wörter im Computer dargestellt wurden. Diese Probleme sind ad acta gelegt, sobald sich Unicode als Standard durchgesetzt hat und es gibt keinen Grund an den veralteten Darstellungsformen festzuhalten, außer, dass man einen leicht erhöhten Speicheraufwand in Kauf nehmen muss. Dieser Nachteil wird aber bei weitem von den Vorteilen aufgewogen.

Schlimm betroffen von den Umstellungen waren auch die Softwarehersteller, die jetzt einem völlig neuen Umstand Rechnung tragen mussten, der sich falsch in den Köpfen der Programmierer festgesetzt hatte: ein Byte war jetzt nicht mehr gleichzusetzen mit einem Buchstaben. Was eigentlich nur wie eine kleine unbedeutende Änderung klingt, hat so viele unangenehme Seiteneffekte, dass es sich lohnt, ihm einen eigenen Abschnitt zu gönnen.