Sql-und-Xml - Home

Xml lernen

Klassifikation und Struktur der Unicode-Datenbank

Vorbemerkung: Die folgenden Ausführungen beschreiben die Struktur der Unicode-Datenbank näher. Eine lokale Darstellung aller Elemente der basic multilingual plane in Form von Html-Seiten liegt als Unicode-Datenbank vor.

Character/Zeichen, Codepunkte und Transformationen

Ein character repertoire (Repertoire von Zeichen) ist definiert als eine ungeordnete Menge abstrakter Zeichen, die codiert werden sollen. 'Abstrakt' meint in diesem Zusammenhang, daß diese Objekte per Konvention definiert sind, das Verständnis ergibt sich aus der Kultur, welche dieses Zeichen nutzt. Ein coded character set (CCS) ist eine Abbildung eines character repertoires in eine Menge nichtnegativer Zahlen. Jedes abstrakte Zeichen einer durch eine solche Abbildung ergänzten character repertoire wird damit zu einem encoded character, die zugeordnete Zahl wird als code point (Codepunkt) bezeichnet. Ein Prinzip von Unicode besteht darin, daß diese Zuordnung zwischen abstraktem Zeichen und Codepunkt umkehrbar eindeutig ist: Jedem Zeichen wird genau ein Codepunkt zugeordnet und jeder denkbare Codepunkt (jede nichtnegative Zahl) entspricht höchstens einem Zeichen. Für die konkrete Verwendung werden Codepunkte mittels einer character encoding form (CEF) auf Bitsequenzen abgebildet. Damit kann dasselbe abstrakte Zeichen in verschiedenen Bitsequenzen ausgedrückt werden, in Abhängigkeit davon, was als Transformation (ASCII, UCS-2, UCS-4, UTF-8, UTF-16) verwendet wird. Die Transformation kann implizit sein, falls ein Zeichen 'A' mit seinem Codepunkt 65 als ASCII-Zeichen mit dem Bitmuster dargestellt wird, welches der binären Darstellung der Zahl 65 entspricht.

Blöcke, Blocknamen, Kategorien und ergänzende Eigenschaften / Properties

Die Menge der Unicode-Codepunkte, wie sie aktuell in der Unicode Character Database definiert ist, ordnet zunächst jeder aufgenommenen englischsprachigen Beschreibung ('LATIN CAPITAL LETTER A' für 'A') einen Codepunkt in hexadezimaler Schreibweise sowie weitere Eigenschaften zu. Die englischsprachige Beschreibung stellt die oben genannte 'Definition per Konvention' dar. Die Codepunkte werden in einzelnen Blöcken angeordnet. Jeder Block umfaßt einen zusammenhängenden Bereich von Codepunkten und ist durch einen englischen Blocknamen bezeichnet. Diese Namen sind teils historisch begründet (Basic Latin entspricht ASCII, damit dem unteren Teil von Latin-1 bzw. ISO-8859-1), sie orientieren sich an Sprachräumen (Greek and Coptic, Thai) oder an funktionalen Zusammenhängen (Currency Symbols, Mathematical Operators). Ferner gibt es Ergänzungen zu bereits vorhandenen Blöcken (Cyrillic Supplement, Latin Extended Additional), deren Codepunkte jedoch nicht an die zugehörigen Grundblöcke anschließen - die Plätze waren bereits von anderen Blöcken belegt. Die sich an geographisch-soziologischen Kriterien orientierenden grundlegenden Blocknamen (ohne 'Supplement', 'extended' usw.) umfassen in der Regel wesentliche Grundzeichen der jeweiligen Kultur, also Zeichen mit verschiedener Funktionalität: Buchstaben, Satzzeichen, Ziffern und diakritische Zeichen bzw. sofort die Kombinationen aus Grundbuchstaben und Sonderzeichen (ä, ö, ü). Um nun, quer über alle Blöcke hinweg, Zeichen eines Typs zu erfassen, gibt es, orthogonal zu den Blöcken, 30 Kategorien (General Category Values). Jeder Codepunkt gehört aufgrund seiner Zahldarstellung zu genau einem Block sowie aufgrund inhaltlicher Überlegungen zu genau einer Kategorie. Diese zweite grundlegende Kategorisierung der General Category Values sammelt Zeichen zusammen, die demselben Typ angehören: Separator, Space (= Leerzeichen), Separator, Line (= Zeilentrenner) und Separator, Paragraph (Absatztrenner) umfassen alle Leerzeichen, Zeilen- und Absatzmarkierungen aus verschiedensten Kulturen. Die Kategorien Punctuation, Open und Punctuation, Close sammeln jene Zeichen, welche im Sinne eines öffnenden und schließenden Klammerpaares verwendet werden. Diese Namen folgen einer einheitlichen Konvention <Hauptbegriff - Unterbegriff>, für jeden Ausdruck gibt es ein eindeutiges Kürzel (Ps = Punctuation, Open, Pe = Punctuation, Close), mit P* werden die Kategorien gemeinsam bezeichnet, die zu demselben Oberbegriff gehören.

Diese doppelte Klassifikation ist zunächst nachvollziehbar: Jede Kultur mag ihre eigenen Zahl- und Satzzeichen verwenden, sie sollten innerhalb des von dieser Kultur genutzten Bereiches von Codepunkten dargestellt werden. Die klassischen Fonts basieren auf Ein-Byte-Codierungen, also waren gewisse, eher unwesentliche Zeichen ausgeschlossen. Wird der traditionelle Zeichensatz in das Unicode-System übernommen und ist der nachfolgende Block bereits belegt, so fehlen bislang ausgeschlossene Zeichen weiterhin. Für diese hat sich im Web-Zeitalter auch ein Bedarf für die Darstellung auf Html-Seiten entwickelt. Die noch Mitte der 90er übliche Technik des Einbindens von winzigen Grafiken für Sonderzeichen ist heutzutage nicht mehr vermittelbar. Also wurden neue Blöcke hinzugefügt, die sich eher an inhaltlichen Kriterien orientieren oder Platz für einzelne, bislang ausgeschlossene Zeichen aus verschiedenen Kulturen bieten. Es gibt deshalb immer wieder Symbole, die an eher unerwarteten Stellen zu finden sind: Das Zeichen ﬩ mit der Bezeichnung HEBREW LETTER ALTERNATIVE PLUS SIGN findet sich im Block 'Alphabetic Presentation Forms', gehört jedoch nicht, wie die meisten anderen Codepunkte dieses Blocks, zur Kategorie der 'Letter', sondern ist aus inhaltlichen Gründen der Kategorie Symbol, Math zugeordnet.

Diese beiden Ordnungsprinzipien in Kombination mit der historischen Entwicklung der Unicode-Darstellung erschweren es, thematisch zusammengehörende Zeichen zu finden. Übliche Darstellungen wie die offiziellen PDF-Charts verwenden die Blöcke als Gliederung. Sucht man jedoch nach allen Symbolen, die für mathematische Darstellungen nutzbar sind, so beschränken sich diese weder auf einen einzigen Block oder eine einzige Kategorie, sondern enthalten manche Blöcke vollständig, aus anderen Blöcken jedoch nur einzelne Zeichen, manche Zeichen gehören zur Kategorie Sm (Symbol, Math), andere sind bei Base Latin und der Kategorie Symbol, Modifier zu finden. Die lokale Darstellung der Unicode-Datenbank enthält deshalb zunächst die zwei Listen von Blocknamen sowie von Kategorien. Zu jedem Block gibt es eine Tabelle, welche alle Zeichen dieses Blocks darstellt. Ferner gibt es zu jeder Kategorie ebenfalls eine Tabelle, die alle zu dieser Kategorie gehörenden Zeichen enthält. Aufgrund dieser Struktur taucht jeder Codepunkt in zwei verschiedenen Tabellen mit seinem Symbol, der numerischen sowie der sprachlichen Darstellung auf. Beide Seiten sind direkt miteinander verlinkt. Die Blockdarstellung enthält zu jedem Codepunkt den Kurznamen der Kategorie als Link zu dieser, von der Kategorie kann zurück zum Block dieses Zeichens gewechselt werden. Ferner handelt es sich um reines Html, es wurde ausschließlich die Darstellung in der Form &#x[Unicode-Word aus vier Zeichen]; verwendet. Damit läßt sich prüfen, ob Zeichen in einem bestimmten Browser sichtbar sind.

Da dies noch nicht sämtliche Klassifikationen erfaßt, wird diese doppelte und disjunkte Ordnung ergänzt durch zusätzliche, additive Properties. Diese sammeln bsp. alle Zeichen, die für die Hexadezimaldarstellung von Codepunkten erlaubt sind oder listen weitere Zeichen auf, die zu mathematischen Zwecken genutzt werden. Ein Zeichen kann in keiner dieser Properties oder in mehreren auftauchen, der Codepunkt 94 (^) ist sowohl unter Diacritic als auch unter Other_Math gelistet. Properties, die mit 'Other' beginnen, bilden zusammen mit den offiziellen Kategorien passenden Namens einzelne DerivedProperties. Auf deren Auflistung in weiteren Tabellen wurde allerdings verzichtet, da die Namenskombinationen selbsterklärend sind.

Character versus Glyphe - die graphische Darstellung von Zeichen

Die bisherigen Festlegungen sagen nichts darüber aus, wie ein abstraktes Zeichen bzw. der ihm zugeordnete Codepunkt am Bildschirm oder gedruckt dargestellt werden soll. Ein Character stellt eine semantische Einheit dar, dasselbe Zeichen kann jedoch, bsp. in Abhängigkeit vom gewählten Font oder in Fett/Kursivdarstellung, verschiedenartig ausgegeben werden. Die graphische Einheit wird als Glyphe bezeichnet. So sind die folgenden Glyphen des Buchstabens Q semantisch äquivalent, die Darstellung unterscheidet sich nur durch den gewählten Font:
Q Q Q Q
Als Font wurde Arial, Times New Roman, Wide Latin und Comic Sans zugewiesen. Für grundlegende Zeichen oder für den englischen Sprachraum ist diese Unterscheidung in Character und Glyphe unproblematisch. In anderen Kulturen einschließlich der europäischen Sprachen gestaltet sich das Verhältnis komplexer. Ein deutsches ö oder ein französisches Ç kann dem Zeichensatz als ein einzelnes Zeichen neu hinzugefügt werden. Ebenso ist es jedoch denkbar, diese Kombinationszeichen in ihre beiden Bestandteile o und Diaeresis aufzulösen, zu beiden Bruchstücken eigene Codepunkte zu definieren und die Diaeresis als ein 'überschreibendes Zeichen ohne horizontalen Vorschub' zu definieren. Das Ergebnis erscheint in derselben Bildschirmdarstellung, beide Prinzipien führen jedoch zu unterschiedlichen Konsequenzen. Werden ö usw. als eigenständige Codepunkte definiert, so vergrößert sich die Zahl der belegten Codepunkte, es können nur jene Zeichen mit Diaeresis dargestellt werden, für welche dies explizit definiert wurde. Wird die Diaeresis dagegen als selbständiges Zeichen eingefügt, so kann sie mit beliebigen anderen Zeichen kombiniert werden, so daß auch ein Ausdruck g̈ ad hoc genutzt werden kann. Gleichzeitig wird nun jedoch die Erzeugung der Ausgabe komplexer, da solche Kombinationszeichen keinen horizontalen Platz verbrauchen.

Tatsächlich sind im Unicode-Standard drei Möglichkeiten definiert: Diverse der bsp. auf Tastaturen angezeigten Kombinationszeichen ö, Ä usw. wurden direkt übernommen und sind in Latin-1 Supplement und analogen Zeichensätzen zu finden. Dann gibt es die diakritischen Zeichen als eigenständige Zeichen mit horizontalem Vorschub, zu finden im Spacing Modifier Letter - Block bzw. zur Kategorie Letter, Modifier gehörend. Zeichen, die in 'modifizierenden' Blöcken oder Kategorien enthalten sind, folgen bsp. relativ nah auf das vorangehende Zeichen und modifizieren dieses, werden jedoch nicht über oder unter dem vorgehenden Zeichen dargestellt. Dies leisten erst Zeichen, die im Block Combining Diacritical Marks oder in der Kategorie Mark, Nonspacing (Mn) zu finden sind. 'Nonspacing' stellt explizit sicher, daß kein horizontaler Zeilenvorschub erfolgt.

Ein Beispiel: Der Kleinbuchstabe a mit verschiedenen Versionen des Circumflex Accent:

CodeErgebnisNameBlockKategorie
a&#x005E;a^Circumflex AccentBasic LatinSymbol, Modifier
a&#x02C6;Modifier Letter Circumflex AccentSpacing Modifier LettersLetter, Modifier
a&#x0302;Combining Circumflex AccentCombining Diacritical MarksMark, Nonspacing
a&#xFF3E;a^Fullwidth Circumflex AccentHalfwidth and Fullwidth FormsSymbol, Modifier
&#x00E2;âLatin small Letter a with CircumflexLatin-1 SupplementLetter, Lowercase

Die letzte Zeile enthält den meist verwendeten Kombinationsbuchstaben. In allen anderen Zeilen sind zwei Codepunkte notiert, deren Formatierung sich aus den Unicode-Eigenschaften ergibt. In Xml könnten diese Zeichen auch direkt eingefügt werden, ohne daß der Umweg über ein Character-Entity notwendig wäre. So kann bsp. in VB.NET mit "a" & Convert.ToChar(770) ein String erzeugt und in eine Datei geschrieben werden, welcher der obigen Darstellung in der dritten Zeile entspricht (&H0302 = 770).

In der Unicode-Datenbank werden alle Zeichen der Kategorie Mn mit einem vorgestellten 'a' ausgegeben, ansonsten würde nichts angezeigt werden. Ein vorgestelltes Leerzeichen führt nicht zwingend zu einer Anzeige, mit einem vorgestellten geschützten Leerzeichen (&#160;) gelingt dies jedoch.

Bidirektionale Kennzeichnungen

Die letzte Zusammenfassung in der Unicode-Datenbank fasst die Eigenschaften aller Zeichen in bezug auf den bidirektionalen Algorithmus zusammen. Denn die am Beispiel diakritischer Zeichen skizzierten Probleme der Darstellung der Zeichen als Glyphen sind nur ein Teilproblem in einem größeren Zusammenhang. Außereuropäische Schriftarten schreiben von rechts nach links oder kennen Zeichen, die ihre Darstellung in Abhängigkeit von dem folgenden Zeichen verändern. Schließlich enthält der Unicode-Standard Festlegungen darüber, wie ein Links-nach-rechts - Satz in einen Rechts-nach-links - Satz und umgekehrt einzubetten ist. Die Tabelle, die mit Ausnahme der beiden sehr großen Klassen Left-to-right sowie Other Neutrals nur relativ kleine Mengen enthält, wurde mit Blick darauf erstellt, daß die zugrundeliegende Spalte in der UnicodeData.txt problemlos auslesbar ist, die Informationen ansonsten jedoch wohl nur schwer zugänglich sind.

Versionen und Unterstützung durch Fonts

Die Menge der Codepunkte wird in einzelnen Versionen veröffentlicht. Jede neue Unicode-Version geht einher mit der Vergrößerung der coded character set, es werden weitere Zeichen auf Codepunkte abgebildet. Die folgenden Daten stammen aus der DerivedAge.txt:

VersionDatumhinzugefügte Codepunkte
1.1Juni 199333.979
2.0Juli 1996144.521
2.1Mai 19982, darunter €
3.0September 199910.307
3.1März 200144.978
3.2März 20021.016
4.0April 20031.226
∑ 236.029

Diese Zahlen, der DerivedAge.txt entnommen, weisen teilweise minimale, teilweise erhebliche Differenzen zu den selbst ermittelten Werten auf. So ergibt sich aus der Vorgabe eine Zahl von 47.402 Codepunkten bis 2.1, hierbei scheinen jedoch FFFE/FFFF mitberücksichtigt worden zu sein. In der UnicodeData.txt tauchen beide Zeichen nicht auf. Damit führt die lokale Version diese als Cn, so daß sich 47.400 Codepunkte bis 2.1 ergeben. Ferner gehört Supplementary Private Use Area-A mit Start F0000 laut der DerivedAge zur Version 2.0. Die UnicodeData.txt von 2.1, die immer die tatsächlich definierten Daten enthält, kennt diesen Wert jedoch nicht, er taucht erst in der Version 3.0 auf. Damit enthält die Version 2.1 den eigenen Auswertungen zufolge keine Codepunkte oberhalb FFFF.

Der Font 'Arial Unicode MS', der bsp. in Office2000 enthalten ist, basiert auf Unicode-2.1 und zeigt diese Zeichenmenge auch vollständig an. Diese Version wird ebenfalls von Opera und FireFox 0.9 dargestellt. Ab der Version 3.0 werden nur noch vereinzelt Zeichen ausgegeben. Folglich dürften Zeichen der Version 2.1 mit den meisten Browsern darstellbar sein, alle Zeichen späterer Versionen sind bislang nur bedingt einsetzbar.

© 2003-2017 Jürgen Auer, Berlin.