Hintergrund Kapitel Abbildungen Literatur Dialog

A    Zeichensätze

Einstieg Die Babylonische Sprachverwirrung ist die biblische Metapher für die Schwierigkeiten der menschlichen Verständigung. Trotz wirtschaftlicher Globalisierung wird es aber vermutlich nie gelingen diese zu überwinden.
Vielleicht gelingt es jedoch irgendwann, wenigstens in der Computerwelt eine allgemein akzeptierte Codierung aller bekannten Schriftzeichen einzuführen.
Summary The language confusion of Babylon is the biblical image for the difficulties of human communication. Despite of economical globalisation we will probably never succeed in overcoming those problems.
Let's hope that we are able at least in the computer area to introduce a worldwide accepted coding of all known characters.

A.1   Entstehungsgeschichte

Wie stellt man Elemente der geschriebenen Sprache (Sätze, Wörter, Buchstaben, Ziffern, Sonderzeichen) im Binärformat der Computer dar?
Da die ersten (mechanischen und elektronischen) Rechenanlagen im westlichen Kulturkreis mit seinen Buchstabenschriften entstanden, lag die Antwort nahe: Man ordnet jedem Zeichen, das man eingeben, speichern, übertragen oder ausgeben will, eine definierte Folge von Dual-Ziffern zu. Den Vorgang nennt man Codierung, das Ergebnis Code. Den manchmal sehr schwierigen Vorgang einer allgemein gültigen Definition nennt man Normung, das Ergebnis Codiervorschrift. Den Zeichenvorrat, der von einer Codiervorschrift erfasst wird, nennt man Zeichensatz, seine codierte Version heißt Codesatz. Zeichensätze können darstellbare Zeichen ("characters", z.B. A B C .. 1 2 3 ... + - %,) und nicht darstellbare Steuerzeichen ("controls", "control characters", z. B. Worttrennung, Zeilentrennung) enthalten.
Aus wirtschaftlichen Gründen sollten die Codes möglichst kurz sein. Die ersten Anfänge liegen im Dunkel der Informatik-Geschichte, aus der nur der BCD-Code als allgemein anerkannter Standard herausragt. Sein Zeichensatz umfasst in einem Zeichenvorrat von 10 Zeichen die Ziffern 0..9, zu seiner Darstellung verwendet man Codes der Länge 4 bit.
Schon bald wollten die Anwender mehr: Zur Darstellung von Texten musste man zusätzlich mindestens die lateinischen Großbuchstaben und einige Sonderzeichen zur Verfügung haben. Man wollte aber höchstens ein zusätzliches Bit, also 5 bit spendieren, um 62 Zeichen darzustellen. Da dies mit direkter Codierung nicht möglich war, erfand man als Ausweg "Codeseiten". Man vergab jeden 5-bit-Code zweimal und definierte zwei zusätzliche Steuerzeichen ("Vorschaltzeichen", "Umschaltzeichen"), die in den Text eingestreut wurden, und die alle nachfolgenden Zeichen einer der beiden Seiten zuordnete, bis ein weiteres Umschaltzeichen eine neue Zuordnung festlegte. Dieses Verfahren wurde erstmals zur Übertragung zwischen Fernschreibern benutzt und dort als Codesatz Nr. 2 genormt (s. Abschnitt 9).
Die Ansprüche wuchsen, und mit leistungsfähigerer und billigerer Hardware auch die Codelänge, und zwar zunächst auf 7 bit. Auch hier wurde ein Zeichensatz zuerst in der Fernschreibtechnik genormt (s. Abschnitt 9.1: Lochstreifen). Er hieß Codesatz Nr. 5, enthielt 128 Zeichen einschließlich Kleinbuchstaben, und wurde später als (7 bit-)ASCII ("American Standard Code for Information Interchange") zum weltweiten Standard im Datenverarbeitungs- und speziell im Textverarbeitungsbereich (Tab. A-01). Für die Zwecke der Fernschreibübertragung spendierte man stolze 32 Steuerzeichen, die uns in allen Zeichensätzen bis heute erhalten geblieben sind, obwohl die meisten ihre Bedeutung schon längst verloren haben. 7 bit-ASCII ist in der deutschen DIN 66003 und in der amerikanischen ISO 646 genormt. In diesen Normen heißt er "Internationale Referenzversion" ("International Reference Version", IRV). DIN 66003 enthält außerdem die "Deutsche Referenzversion" ("DRV"), bei der einige Klammer- und andere Zeichen den Umlauten und dem scharfen s weichen mussten. Diese und andere nationale Referenzversionen sind auch in ISO 646 definiert.

A.2    8 bit-Zeichencodes

Bei der später fälligen Erweiterung auf 8 bit und damit auf Zeichenvorräte mit 256 Zeichen stand die gute alte Fernschreibtechnik nicht mehr zur Verfügung, bei der ja im übrigen das achte Bit schon als Paritätsbit vergeben war.
Deswegen entbrannte ein Kleinkrieg um die Zuordnung der Zeichen 128..255, in dem sich auf Dauer zwei Konkurrenten behaupten konnten, die die Zeichenwelt im Computer noch heute unter sich aufteilen:
IBM kreierte einen Firmenstandard, der als "Erweiterter ASCII" ("Extended ASCII", "8 bit-ASCII", "IBM-ASCII", "DOS-ASCII") im Betriebssystem MS-DOS und damit in allen "kompatiblen" PCs Einzug hielt (Tab. A-01). Er verzichtet auf zusätzliche Steuerzeichen in der oberen Hälfte des Codesatzes und führt neben einigen westeuropäischen und griechischen Sonderbuchstaben (osteuropäisch war in dieser Zeit in der Computerwelt noch tabu) vor allem viele "Blockgrafiksymbole" zum "Malen" von Linien und Rahmen ein.
Mit einiger Verspätung wurden jedoch auch die Normungsgremien tätig und schufen zunächst den sogenannten ANSI-Code (ISO 6937/2). Er enthält keine Grafiksymbole, dafür mehr lateinische Sonderbuchstaben und reservierten Platz für einen zweiten Satz von 32 Steuerzeichen. In der DIN 66303 wird dieser Code als "Allgemeine Referenzversion des 8 bit-Code (ARV8)" bezeichnet. Auch hier gibt es (unnötigerweise) eine Deutsche Referenzversion mit den Umlauten in der unteren Codehälfte.
Aber auch 8 bit waren bald zu wenig für die anspruchsvolleren Anwender und vor allem für die Schwellen- und Entwicklungsländer, die inzwischen auch interessant wurden für den Computermarkt. IBM erweiterte den Zeichenvorrat durch die Einführung von Codeseiten ("Codepages"), die sich durch Betriebssystembefehle umschalten ließen. Die untere Hälfte der Codetabelle ist für alle Codeseiten gleich. Hier einige Beispiele:

Codepage Name Beschreibung
437 US ("DOS Latin US") Erweiterter ASCII, mit Schriftzeichen und Blockgrafik auf den Plätzen 128..255
850 Multilingual Latin 1 wie 437, aber Ersatz "gemischter" Blockgrafiksymbole durch zusätzliche Schriftzeichen
1250 wie 437, aber ganz ohne Blockgrafik
1251 Cyrl mit kyrillischen Buchstaben; ohne Blockgrafik
1252 Win Latin 1 wie ISO-6937-2, aber mit zusätzlichen darstellbaren Zeichen auf den Plätzen 128..159
1253 Greek mit griechischen Buchstaben; ohne Blockgrafik

Die Normungsgremien reagierten mit Vielfach-Zeichensätzen, die in ISO 8859 genormt wurden (ISO 8859-1; ISO Latin-1 siehe Tab. A-01) und sich vor allem im Internet durchsetzen konnten.
Schließlich wagten beide, Industrie und Gremien, den großen Sprung auf variable Codelängen von 8, 16 oder 32 bit, was genug Platz bieten sollte für alle Schriftsysteme, auch für die ostasiatischen Ideogramme und die klingonische Schrift.
Man konnte sich glücklicherweise auf eine gemeinsame Version einigen und auch Microsoft wieder mit ins Boot holen. Der Unicode-Standard war geboren und ist auf dem besten Weg, sich allgemein zu etablieren.

A.3   Unicode

A.3.1  Entstehung, Bedeutung

Die Ablösung des guten alten ASCII-Codes und seiner vielen inkompatiblen Erweiterungen war längst überfällig, als sich ab 1983 eine ISO/IEC-Kommission (ISO 10646) mit der Entwicklung eines Mehrbyte-Codes befasste. Die Bemühungen kamen jedoch nicht so richtig vom Fleck. Deshalb entwickelten seit 1987 einige Firmen ein gemeinsames Alternativprodukt, das sie "Unicode" nannten. 1991 führten diese Aktivitäten zur Gründung der Firma Unicode Inc., auch Unicode Konsortium genannt.
Zum Glück für die Computerwelt gelang es Anfang der Neunziger Jahre, diese beiden Entwicklungen zu verheiraten und eine volle Kompatibilität der beiden Zeichensätze zu erreichen. ISO unterteilte die 231 = 2147483648 Codepositionen, die mit 4 Byte adressierbar sind, in

128 Gruppen zu 256 Plateaus zu 256 Reihen zu 256 Zellen (Abb. A-2).

Plateau 00 der Gruppe 00 heißt auch "Basic Multilingual Plane"; BMP und enthält in der Reihe 00 die Zeichen nach ASCII und ISO8859 ("Latin-1"). ISO 10646 (und damit auch Unicode) belegt inzwischen die ersten 17 Plateaus.
Unicode hat inzwischen in vielen bekannten Betriebssystemen und im Internet Einzug gehalten. Es verdankt seinen Erfolg einer gründlichen Vorarbeit und den grundlegenden Eigenschaften, die im folgenden Unterabschnitt kurz beschrieben werden.
Aus dem (englischen) Unicode-Standard:
"Ein Standard-Zeichensatz wie Unicode ermöglicht die Realisierung nützlicher textbasierter Anwendungen. Als Endprodukt sind dabei nicht die Zeichencodes von Interesse, sondern die Textprozesse, weil nur diese unmittelbar die Erfordernisse des Systembenutzers erfüllen. Zeichencodes sind wie Schrauben und Muttern --untergeordnet, aber wesentliche und allgegenwärtige Bestandteile, die auf viele verschiedene Arten bei der Konstruktion von Software-Systemen eingesetzt werden. Ein einziger Zeichensatz kann nicht gleich gut geeignet sein für alle Anwendungen, deshalb strebt die Architektur des Unicode Standards einen Kompromiss an zwischen mehreren konkurrierenden Anforderungen."

A.3.2 Eigenschaften

    Verwendungsbereich

Mit 1112064 adressierbaren Codepositionen deckt der Unicode-Zeichensatz die Schriftsysteme (fast) aller bekannten lebenden und einiger historischer Sprachen ab (s. Tab. A-3). Außerdem sind eine Vielzahl mathematischer und technischer Sonderzeichen sowie anwendungsdefinierbare Zeichen enthalten.
Ein anwendungsspezifischer Bereich ("Private use") erlaubt bestimmten Anwendungen oder Benutzergruppen die Verwendung eigener Zeichen.

    Eindeutigkeit

Jedes Zeichen wird in einer Unicode-Datenbank durch drei Bestandteile definiert und beschrieben:
  • Eindeutige Codeposition ("Scalar") zwischen U+0000 und U+10FFFF

  • Stellvertretendes Darstellungssymbol. Dessen formatierte Ausprägungen ("Instanzen") müssen die Verwandtschaft erkennen lassen.

  • Textuelle Beschreibung in englisch, besteht nur aus lateinischen Großbuchstaben, Bindestrich und Leerzeichen.

Für die unterschiedliche Verwendung der Zeichen enthält die Datenbank noch viele kennzeichnende Eigenschaften (z.B. Großbuchstabe, Ziffer, diakritisches Zeichen usw.).
Escape-Sequenzen oder Mehrdeutigkeiten, die durch Codesatzumschaltungen aufgelöst werden müssen, gibt es nicht mehr.
Gleiche Zeichen aus ähnlichen Schriftsystemen werden zusammengefasst, z.B. zu einem "Latin"-Block vieler europäischer Sprachen oder zu CJK-Ideogrammen, die gleichermaßen für chinesische Schriftzeichen und japanische Kanji verwendet werden können. Zufällig gleiche oder ähnliche Zeichen aus unterschiedlichen Schriftsystemen werden getrennt aufgeführt, um solche Schriftblöcke nicht auseinanderzureißen, und um beispielsweise Umwandlungen systematisch durchführen zu können. Scharfes s und Beta werden genauso unterschieden wie GROSSBUCHSTABE P und griechisches RHO.

    Formatierung

Grundsätzlich codiert Unicode unformatierten Text. Es gibt jedoch kleine Ausnahmen, etwa Formatsteuerzeichen für die Umschaltung der Leserichtung bei bidirektionalen Schriftsystemen.
Die Zeichen einer Buchstabenschrift sind üblicherweise (mehr oder weniger eindeutig) den Lauten einer Sprache zugeordnet. Der grundlegende Buchstabenvorrat einer Sprache heißt Alphabet. Die meisten Sprachen besitzen außerdem die Fähigkeit, die Darstellung der Buchstaben zu modifizieren und dadurch Aussprachebesonderheiten oder semantische Hervorhebungen anzuzeigen. Ob diese Modifikationen zu eigenen Zeichen führen oder als unterschiedliche Formatierungen eines Zeichens betrachtet werden, ist eigentlich willkürlich. Es ist jedoch inzwischen allgemeine Übereinkunft der Textverarbeiter, dann neue Zeichen zu schaffen (und damit einen eigenen Code), wenn die Modifikation nur einzelne, bestimmte Zeichen betreffen kann (Versalität, Umlaute, Akzente: a A ä à) und von Formatierung zu sprechen, wenn mehrere (nebeneinanderstehende) Zeichen betroffen sein können (Schriftart, Schriftgröße, Auszeichnung).
Bei manchen Schriftsystemen spielt die gegenseitige Position der einzelnen Buchstaben eine Rolle für Bedeutung oder Aussprache. Für diese Fälle stellt Unicode entsprechende Regeln und Mechanismen zur Verfügung. Fachsprachen werden durch diese Eigenschaft noch wenig unterstützt. Es gibt zwar inzwischen einen Block mit musikalischen Zeichen, aber (noch ?) keine von Unicode unterstützte Möglichkeit, mathematische oder chemische Zeichen zu Formeln zu kombinieren. Auch Tanzschriften, stenografische Notierung und Barcode-Schriften werden nicht unterstützt.

    Effizienz

Der 7 bit ASCII Code verdankt seine Existenz einem Kompromiss zwischen möglichst vielen unterschiedlichen Zeichen und möglichst geringen Speicher- und Übertragungskosten. Auch wenn sich das Gewicht durch massiv gesunkene Hardwarepreise seitdem entsprechend verlagert hat, gibt es noch genug Fälle, wo es durchaus darauf ankommt, ob ein Zeichen mit 8, 16 oder gar 32 bit codiert wird.
Während ISO ursprünglich konstant 4 Byte pro Zeichen vorsah, versuchte man bei Unicode, mit 2 Byte pro Zeichen auszukommen, merkte aber bald, dass man das nicht würde durchhalten können. Sowohl ISO10646 als auch Unicode sehen deshalb inzwischen mehrere zueinander kompatible Implementierungsvarianten vor.
  • UTF-32 in Unicode (= UCS 4 in ISO) verwendet genau 32 bit (=4 Byte), um jede Codeposition darzustellen. Auch diese konsequente Implementierung lässt sich natürlich nur so lange durchhalten, wie nicht mehr als 256 ISO-Plateaus verwendet werden.

  • UTF-16 in Unicode (= UCS 2 in ISO) ist bereits ein Code mit variabler Codelänge. Steht ein Zeichen im Grundbereich (BMP: Plateau 00), wird es mit 2, im Erweiterungsbereich (Plateau 01 .. 16) mit 4 Byte codiert.

  • UTF-8 ist meistens noch effizienter, hat allerdings keine Entsprechung in ISO. Werden nur Zeichen aus dem Adressbereich 00 .. 7F verwendet, können alte Texte unverändert übernommen werden, da diese Zeichen ebenfalls mit (den gleichen) 8 bit-Codewerten verschlüsselt werden. Bei höheren Adressen werden auch Codelängen von 2, 3 und 4 Byte verwendet. Bei überwiegender Verwendung ostasiatischer Zeichen ist diese Implementierung dagegen ineffizienter als UTF-16.

    Sicherheit

Während bei der erweiterten ASCII-Codierung durch Fehler beim Escape-Zeichen oder bei der Codesatzumschaltung ganze Textbereiche verfälscht werden konnten, ist bei Unicode durch die Codestruktur sichergestellt, dass durch Fehler in einem Byte auch nur genau ein Zeichen verfälscht wird. Dies gilt prinzipiell für alle Implementierungen.
Probleme kann es jedoch geben, wenn der Anfang einer Datei fehlt. Während UTF-8 nach spätestens 4 Byte die Zeichengrenzen sicher analysieren kann, muss bei UTF-16 und UTF-32 die übergeordnete Anwendung dafür sorgen, dass die falsche Synchronisation nicht dauerhaft erhalten bleibt.
Der Umgang mit undefinierten, weil noch nicht belegten Codes und mit unerlaubten Codewerten, wie zum Beispiel einzeln stehende Erweiterungsadressen in UTF-16 ist im Standard genau geregelt.

    Kompatibilität

Sollen alte Texte in UTF-8 umgesetzt werden, ist keine Konvertierung nötig, solange sie nur 7 bit ASCII Zeichen enthalten. Auch eine Umsetzung in UTF-16 ist in diesem Fall ziemlich einfach: Jedes Byte bekommt ein Null-Byte vorangestellt. Etwas aufwändiger wird es jedoch, wenn erweiterte ASCII-Zeichen vorkommen. Dafür gibt es Konvertierroutinen für alle 8 bit-Zeichensätze, die bei der Einführung von Unicode bekannt waren.

    Skalierbarkeit

Undefinierbare Zeichen werden bei Unicode grundsätzlich nicht unterdrückt oder ersetzt. Dadurch kann ein Text, der mit einer einfachen Anwendung nicht vollständig erkannt werden kann, weil diese beispielsweise nur eine Untermenge der definierten Unicodes kennt, anschließend ohne Probleme mit einem leistungsfähigeren Programm bearbeitet werden.

    Textanwendungsorientierung

Wesentlich stärker als alte Zeichensätze geht Unicode auf Anforderungen von Textverarbeitungsanwendungen und Besonderheiten von Schriftsystemen ein.
So werden beispielsweise hebräische und arabische Schriften realisiert, indem den entsprechenden Zeichen die Eigenschaft der umgekehrten Schreibrichtung mitgegeben wird. Für bidirektionale Schriften gibt es Steuerzeichen zur Schreibrichtungsumkehr. Gespeichert werden alle Zeichen in "logischer" Reihenfolge, d.h. nach Erzeugung, nicht nach Darstellung.
Auch wird bei diakritischen Zeichen (die nur in Kombination mit Basiszeichen verwendet werden) festgelegt, wo sie in Bezug zum Basiszeichen positioniert werden. Das trifft für Aussprachemodifikationen durch Akzente genauso zu wie für die in manchen Sprachen übliche Darstellung der Vokale durch Modifikation der Konsonanten.
Zur Unterstützung der Textverarbeitung führen Zeichen auch noch andere Eigenschaften mit, beispielsweise Versalität (Großbuchstabe / Kleinbuchstabe), Umsetzbarkeit in Ziffernwert und generelle Kategorie. Außerdem stehen sprachspezifische Tabellen zum Vergleichen und Sortieren zur Verfügung. Semantisch gleiche Folgen dürfen ineinander übergeführt werden (z.B. a + ¨ ersetzt durch ä, aber nicht ß durch ss), beim Sortieren sind wieder andere Folgen gleichwertig (im Deutschen kein Unterschied zwischen a und A, zwischen ß und ss, zwischen ä und ae).
Als nichtdruckbare Zeichen gibt es Abschnittendezeichen, Zeilenende und Leerzeichen mit verschiedenen Eigenschaften.

A.3.3 Aufbau und Gliederung

Derzeit (d.h. bei Version 3.1) gibt es drei verschiedene Ausprägungen von Unicode: UTF-32, UTF-16 und UTF-8. Die Konvertierung zwischen diesen Implementierungen ist verlustlos möglich und ist zusammen mit den jeweils erlaubten Codebereichen in Abb. A-5 dargestellt. Nur für diese Darstellung dient die Einteilung in vier Teilbereiche (1) - (4)

UTF-32 Es handelt sich um einen Code mit fester Wortlänge von 4 Byte pro Zeichen. Der gesamte Codebereich, der für Unicode definiert ist (0...10FFFF), wird direkt codiert. Ausnahme: Die Codes D800 .. DFFF werden nicht verwendet. Insgesamt könnten also 2147481600 (= 232 - 2048) 4 Byte-Zeichen codiert werden. Tatsächlich sind jedoch, um die Konvertierbarkeit in UTF-16 und UTF-8 zu erhalten, nur
1112064 (= 17 * 65536 - 2048) 4 Byte-Zeichen belegt.
UTF-32LE Im Speicher beginnt das Codewort mit dem niederwertigen Byte.
UTF-32BE Im Speicher beginnt das Codewort mit dem höherwertigen Byte.
UTF-16 Es handelt sich um einen Code mit zwei verschiedenen Wortlängen: Zeichen der Bereiche (1) - (3) werden mit 2 Byte, aus dem Bereich (4) mit 4 Byte pro Zeichen codiert. Bei einem 4 Byte-Code fängt das höherwertige Doppelbyte (High surrogate) mit D8, D9, DA oder DB an, das niederwertige (Low surrogate) mit DC, DD, DE oder DF.
Ein Teilbereich (D8xx .. DFxx) wird also von der 2 Byte-Codierung ausgeschlossen, um mit seinen Codes die Zugehörigkeit zur 4 Byte-Codierung zu kennzeichnen. Dieses Prinzip wird für Codes variabler Länge oft benutzt.
Insgesamt erlaubt UTF-16 also die Codierung von
63488 (= 65536 - 2048) 2 Byte-Zeichen und
1048576 (= 1024 * 1024) 4 Byte-Zeichen.
Tab. A-6 enthält eine Auswahl wichtiger Zeichen, darunter den kompletten ANSI-Zeichensatz sowie griechische und kyrillische Buchstaben.
UTF-16LE Im Speicher beginnt das Codewort mit dem niederwertigen Byte.
UTF-16BE Im Speicher beginnt das Codewort mit dem höherwertigen Byte.
UTF-8 Es handelt sich um einen Code variabler Wortlänge mit 1, 2, 3 oder 4 Byte pro Zeichen. Hier ist das oben beschriebene Prinzip noch konsequenter und in mehreren Stufen angewandt. Geschaffen wurde diese Implementierung ursprünglich für das WWW und um reine ASCII-Texte einfach und effizient konvertieren zu können. Die 1 Byte-Zeichen werden nämlich identisch zu ASCII codiert. Es gibt Codes für
128 1 Byte-Zeichen,
1920 (= 2048 - 128) 2 Byte-Zeichen,
61440 (= 65536 - 2048 - 2048) 3 Byte-Zeichen und
1048576 (= 1024 * 1024) 4 Byte-Zeichen.

Es gibt mehrere Möglichkeiten, die definierten Unicodes zu klassifizieren. Zwei davon werden hauptsächlich verwendet:
Eine Gruppierung nach Schriftsystemen und Verwendungsbereichen wurde ursprünglich benutzt, um den Codebereich in entsprechende Blöcke zu unterteilen. Inzwischen sind jedoch manche Schriften auf mehrere unzusammenhängende Bereiche verstreut. Tab. A-3 gibt einen Überblick.
Jedes Zeichen gehört außerdem zu einer "generellen Kategorie".