• +49-(0)721-402485-12
Ihre Experten für XML, XQuery und XML-Datenbanken

Unicode-Behandlung

Zeichenketten können in eine Folge von Unicode-Codepoints umgewandelt werden und umgekehrt. Die Funktion fn:codepoints-to-string akzeptiert eine Sequenz von ganzen Zahlen, die als Codepoints interpretiert werden und liefert eine entsprechende Zeichenkette zurück. Analog liefert die Funktion fn:string-to-codepoints die Codepoints für eine Zeichenkette zurück. Das Ergebnis der folgenden Ausdrücke ist gleich:

fn:codepoints-to-string((58, 4D, 4C))
"XML"
"XML"

Die Signaturen der Funktionen finden sich in folgender Tabelle.

SignaturBeschreibung
fn:codepoints-to-string(
$arg as xs:integer*)
as xs:string
liefert eine Zeichenkette aus den angegebenen
Unicode-Codepoints
fn:string-to-codepoints(
$arg as xs:string?)
as xs:integer*
liefert die Unicode-Codepoints zu einer Zeichenkette

Tab. Umwandlung zwischen Codepoints und Zeichenketten

In manchen Schriften gibt es viele modifizierende Zeichen zu Grundbuchstaben
(wie wir sie aus europäischen Sprachen beispielsweise in Form von Akzenten oder Doppelpunkten über den Buchstaben kennen: ä é à ñ ÿ Å ç).

Die möglichen Kombinationen sind so vielfältig, dass man sich bei der Definition von Unicode entschieden hat, nicht jeder Kombination einen eigenen Codepoint zuzuordnen, sondern die Kombinationszeichen einzeln zu kodieren, so dass ein Buchstabe wie ñ durch eine Folge von Codepoints dargestellt werden kann: U+006E (n) und U+0303 ("kombinierende" Tilde). Die kombinierenden Zeichen stehen dabei immer hinter dem Grundbuchstaben. Hier ergibt sich nun das Problem der Normalisierung, und zwar aus zwei Gründen:

  • Gerade in asiatischen Schriften können mehrere kombinierende Zeichen auf einen Grundbuchstaben angewendet werden, wobei zunächst jede Reihenfolge der kombinierenden Zeichen zugelassen ist.
  • Einige Kombinationen sind auch als eigene Codepoints definiert, etwa ñ als U+00F1, bedingt durch die Übernahme von Latin-1.

Somit kann ein Zeichen äquivalent mit verschiedenen Kombinationen von Codepoints dargestellt werden, ein Effekt, der besonders beim Vergleich von Zeichenketten hinderlich ist. Um dieses Problem zu entschärfen, definiert Unicode einige Normalisierungsverfahren, die das Ziel haben, alle verschiedenen Darstellungen desselben Zeichens auf eine Darstellung zurückzuführen.

Dabei kann entweder auf eine vollständig zerlegte Darstellung normalisiert werden (die Normalisierungsform heißt NFD), so dass U+00F1 immer in eine Folge von U+006E und U+0303 transformiert wird, oder es werden zusammengesetzte Zeichen verwendet, wo das möglich ist (NFC); aus U+006E und U+0303 wird also U+00F1. Dabei wird erst NFD hergestellt und dann eine so genannte kanonische Komposition angewandt. In beiden Fällen ist für die verbleibenden Kombinationszeichen eine bestimmte Reihenfolge vorgeschrieben.

Nun gibt es neben den äquivalenten Zeichenfolgen (U+00F1 ist äquivalent zu U+006E und U+0303, so dass die Verwendung einer der beiden Kodierungen keine Zusatzinformation zu der anderen trägt) auch noch so genannte kompatible Zeichenfolgen. So hat zum Beispiel die im Niederländischen häufig verwendete Ligatur ij einen eigenen Codepoint in Unicode (U+0133). Sie wird nicht als äquivalent angesehen zur Aufeinanderfolge von i und j, denn wenn sie durch diese beiden Buchstaben ersetzt würde, ginge Information (hier: Formatierungsinformation) verloren.

Da in vielen Szenarien aber eine Gleichbehandlung erwünscht sein dürfte, erklärt Unicode die Ligatur ij und die Kombination aus i und j für kompatibel. Die Normalisierungsformen NFKD und NFKC berücksichtigen auch kompatible Zeichen und führen sie in eine gemeinsame Darstellung über, und zwar NFKD analog zu NFD mit maximaler Zerlegung, NFKC analog zu NFC mit Verwendung zusammengesetzter Zeichen.

XQuery bietet die Funktion fn:normalize-unicode() an, um eine solche Normalisierung durchzuführen. Die gewünschte Normalisierungsform kann dabei als Parameter übergeben werden. Wird ein solcher Parameter nicht übergeben, so wird gemäß NFC normalisiert.

 

Quelle: "XQuery – Grundlagen und fortgeschrittene Methoden", dpunkt-Verlag, Heidelberg (2004)

<< zurückvor >>