Unicode-Casing-Algorithmus
# Unicode-Casing-Algorithmus

Der Unicode-Standard beinhaltet verschiedene Algorithmen, die die Groß- und Kleinschreibung (englisch case) betreffen, die Unicode-Casing-Algorithmen. Diese Algorithmen erlauben es, Texte in eine andere Schreibweise zu überführen (etwa alle Buchstaben in Kleinbuchstaben verwandeln), festzustellen, ob ein Text in einer bestimmten Schreibweise vorliegt (beispielsweise vollständig in Großschreibung), und zwei Texte unabhängig von ihrer Schreibweise auf Gleichheit zu überprüfen. Die Algorithmen erlauben teilweise eine Anpassung an die verwendete Sprache. So ist in den meisten Sprachen der zum kleinen i gehörende Großbuchstabe das gewöhnliche große I, im Türkischen dagegen das große İ mit übergesetztem Punkt.

## Grundlagen

Es gibt drei verschiedene Schreibweisen, die einen speziellen Namen haben: Die Kleinschreibung, bei der alle Buchstaben als Kleinbuchstaben vorliegen, die Großschreibung, bei der alle Buchstaben als Großbuchstaben vorliegen, und die Titelschreibung, bei der jeweils der erste Buchstabe eines Wortes ein Großbuchstabe ist, während die folgenden Buchstaben Kleinbuchstaben sind. Zudem gibt es die sogenannte Casefold-Normalform.

Zu jedem Unicode-Zeichen definiert der Unicode-Standard eine Reihe von Eigenschaften, die bei den Algorithmen verwendet werden. Diese Eigenschaften geben an, ob ein Zeichen ein Klein- oder ein Großbuchstabe ist, und welches gegebenenfalls der zugehörige Groß- oder Kleinbuchstabe ist.

Die Zuordnungen von Klein- und Großbuchstaben können in drei Gruppen aufgeteilt werden:

* Bei den einfachen Abbildungen wird jedem Buchstaben nur ein einzelnes Zeichen zugeordnet, etwa a als Kleinbuchstabe zu A
* Bei den komplexen Abbildungen wird einem Buchstaben eine Zeichenkette aus mehreren Zeichen zugeordnet. So wird das ß beim Umwandeln in Großbuchstaben zu zwei Zeichen SS. Dies geschieht auch bei Umwandlungen von Buchstaben mit diakritischen Zeichen, die in nur einer Schreibweise kodiert wurden. Das kleine W mit übergesetztem Ring (ẘ, U+1E98) muss bei der Umwandlung in Großbuchstaben durch zwei Zeichen dargestellt werden: ein großes W und ein kombinierender übergesetzter Ring.
* Schließlich gibt es noch Umwandlungen, die von der Sprache oder von einem bestimmten Kontext abhängen. So wird das große griechische Sigma (Σ, U+03A3) bei der Umwandlung in Kleinschreibung zum gewöhnlichen kleinen Sigma (σ, U+03C3), außer es steht am Ende eines Wortes. In diesem Fall nimmt der Kleinbuchstabe die Schlussform (ς, U+03C2) an. Umfangreiche Regeln für verschiedene Sprachen stehen im Common Locale Data Repository zur Verfügung.

## Änderung der Schreibweise

Um einen Text in Kleinschreibung zu überführen, wird jedes Zeichen durch den zugehörigen Kleinbuchstaben ersetzt. Dabei sind sowohl die einfachen als auch die komplexen Umwandlungen anzuwenden, sowie der Kontext zu beachten, in dem das Zeichen jeweils steht. Analog wird die Umwandlung in Großschreibung durchgeführt.

Für die Umwandlung in Titelschreibung werden zunächst die Wortgrenzen gemäß dem entsprechenden Unicode-Segmentierungsalgorithmus bestimmt. Für jedes Wort wird das erste Zeichen ermittelt, das in unterschiedlichen Schreibweisen vorliegen kann und dieses durch die zugehörige Titelschreibung ersetzt. Die restlichen Zeichen bis zur nächsten Wortgrenze werden in Kleinbuchstaben umgewandelt.

Mögliche Anpassungen dieser Algorithmen bestehen darin, andere Abbildungen für die einzelnen Zeichen zu verwenden, beispielsweise nur die einfachen Umwandlungen oder sprachspezifische Varianten. Auch könnte man das große ß als Großschreibung des „ß“ verwenden.

Will man beispielsweise das Wort „Wikipedia“ in Großschreibung umwandeln, so ersetzt man einfach jeden Buchstaben durch den zugehörigen Großbuchstaben und erhält „WIKIPEDIA“. Überführt man dagegen das türkische Wort für Wikipedia „Vikipedi“ in Großschreibung, so sollte man die entsprechenden Abbildungen für Türkisch verwenden, die als Großbuchstabe zum „i“ das „İ“ (U+0130) angeben, sodass sich hier „VİKİPEDİ“ ergibt.

Möchte man „ΚΌΣΜΟΣ“ in Kleinbuchstaben umwandeln, so steht das erste Sigma in der Wortmitte, wird also zu „σ“, während das zweite Sigma am Wortende steht und in ein „ς“ umgewandelt wird. Es ergibt sich also „κόσμος“.

## Schreibweisen-unabhängiger Vergleich

Um zwei Texte unabhängig von ihrer Schreibweise auf Gleichheit zu überprüfen, werden beide in eine spezielle Normalform überführt. Diese casefold genannte Normalform basiert im Wesentlichen auf der Kleinschreibung. Auch hier werden alle Zeichen einzeln durch ihre Case_Folding-Entsprechung ersetzt.

Anschließend sollten beide Texte in dieselbe Unicode-Normalform überführt werden, bevor sie verglichen werden. Tatsächlich ist es in einigen seltenen Fällen notwendig, die verschiedenen Normalisierungen mehrfach abwechselnd zu wiederholen.

Eine spezielle Variante ist für schreibweisen-unabhängige Bezeichner in Programmiersprachen gedacht: Hier werden zusätzlich alle Zeichen entfernt, die als Default_Ignorable gekennzeichnet sind (etwa Steuerzeichen zur Formatierung), und die Zeichenkette anschließend in die Normalform NFKC überführt. Zur Vereinfachung gibt es die Eigenschaft NFKC_Casefold, die eine einfache Umwandlung der einzelnen Zeichen erlaubt, sodass am Ende nur noch die Umordnung der kombinierenden Zeichen und die Überführung in die kombinierte Normalform separat erfolgen muss.

Will man beispielsweise prüfen, ob die beiden Wörter „MASSE“ und „Maße“ unabhängig von der Schreibweise übereinstimmen, so überführt man beide in die Casefold-Normalform, indem man für jeden Buchstaben die Case_Folding-Eigenschaft nachschlägt und die Buchstaben entsprechend ersetzt. Für das erste Wort ergibt sich „masse“, da alle Großbuchstaben durch Kleinbuchstaben ersetzt werden. Auch das zweite Wort wird zu „masse“ normalisiert, da für das ß die Normalisierung „ss“ angegeben ist. Die beiden Wörter stimmen also bis auf die Schreibweise überein.

## Feststellen der Schreibweise

Um festzustellen, ob ein Text in einer bestimmten Schreibweise vorliegt, wird er in diese umgewandelt. Ändert er sich dabei nicht, so lag er bereits in dieser Schreibweise vor. Zur Vereinfachung steht zu jeder Schreibweise einschließlich des casefold eine Eigenschaft zur Verfügung, die angibt, ob sich das Zeichen ändert oder nicht, sodass nur noch für jedes Zeichen diese Eigenschaft getestet werden muss. Genau dann liegt ein Text in einer bestimmten Schreibweise vor, wenn keines seiner Zeichen sich bei der Umwandlung ändern würde.

Texte, die nur aus Zeichen bestehen, die wie Ziffern keine unterschiedliche Groß- oder Kleinschreibung besitzen, liegen nach dieser Definition in jeder Schreibweise vor. Um also zu überprüfen, ob ein Text vollständig in Kleinbuchstaben vorliegt, ist es sinnvoll, nicht nur zu prüfen, ob er sich nach dieser Definition in Kleinschreibung befindet. Zusätzlich sollte getestet werden, ob es eine Schreibweise gibt, die nicht zutrifft.

So liegen sowohl „UNICODE“ als auch „123“ in Großschreibung vor, nicht aber „Unicode“. Dies kann man entweder überprüfen, indem man die Umwandlungen vornimmt, oder indem man die Changes_When_Uppercased-Eigenschaft aller Zeichen betrachtet. Während bei den beiden ersten Zeichenketten diese für alle Zeichen falsch ist, hat die dritte Zeichenkette Buchstaben mit dieser Eigenschaft, nämlich das „n“ und alle folgenden. „UNICODE“ ist dabei eine echte Großschreibung, da das Wort nicht auch in Kleinschreibung vorliegt, diese wäre „unicode“. „123“ liegt dagegen in allen Schreibweisen vor, wie man durch die einzelnen Umwandlungen überprüfen kann, oder anhand der Changes_When_Casemapped-Eigenschaft. Diese gibt an, ob sich ein Zeichen bei irgendeiner Umwandlung ändert. Für die Ziffern ist sie also immer falsch, während sie bei lateinischen Buchstaben zutrifft.

## Quellen

* Julie D. Allen et al.: The Unicode Standard. Version 6.2 – Core Specification. The Unicode Consortium, Mountain View, CA, 2012. ISBN 978-1-936213-07-8. (online, PDF)
