Loading AI tools
Aus Wikipedia, der freien Enzyklopädie
Der Unicode-Standard kennt unterschiedliche Normalformen von Unicode-Zeichenketten und Algorithmen zur Normalisierung, also zur Überführung einer Zeichenkette in eine solche Normalform.
Für viele Zeichen gibt es mehrere Möglichkeiten, sie als Kette von Unicode-Zeichen darzustellen (z. B. das „ö“ als solches oder als „o“ mit Trema). Ein einfacher Byte-Vergleich genügt daher nicht, denn er könnte Unterschiede in der Codierung erkennen, die aber keine Unterschiede im Text bedeuten. Um festzustellen, ob zwei Zeichenketten den gleichen Text repräsentieren, ist es daher hilfreich, beide in die gleiche Normalform zu überführen.
Es gibt vier Normalformen:[1]
kanonische Äquivalenz | kompatible Äquivalenz | |
---|---|---|
zerlegt | NFD | NFKD |
kombiniert | NFC | NFKC |
In den zerlegten Formen NFD und NFKD werden alle Zeichen, die sich auch mit Hilfe kombinierender Zeichen darstellen lassen, zerlegt.
In den zusammengesetzten Formen NFC und NFKC wird ein einzelnes Zeichen für eine Folge aus Grundzeichen und kombinierenden Zeichen gewählt, falls dies möglich ist.
Wenn zwei Zeichenketten kanonisch äquivalent (im Unicode-Standard englisch canonically equivalent[1]) sind, dann stellen sie exakt den gleichen Inhalt dar, nur sind eventuell andere Folgen von Unicode-Zeichen gewählt. Dass es mehrere Darstellungen gibt, hat mehrere Gründe:
U+0061 U+0308 U+0320
als auch U+0061 U+0320 U+0308
ergeben ä̠.U+0061 U+0308 U+0304
ergibt ǟ, U+0061 U+0304 U+0308
dagegen ā̈.Sind zwei Zeichenketten nur kompatibel äquivalent (im Unicode-Standard englisch compatibly equivalent[1]), so stellen sie zwar den gleichen Inhalt dar, allerdings kann die Darstellung leicht unterschiedlich sein. Folgende Abweichungen können vorkommen:
Die Überführung einer Zeichenkette in eine der vier Normalformen nennt man Normalisierung. Um diese durchzuführen, definiert der Unicode-Standard mehrere Eigenschaften:
Decomposition_Mapping
gibt zu jedem Zeichen an, in welche Zeichenfolge es zerlegt werden kann, falls dies möglich ist. Die Eigenschaft nennt sowohl die kanonischen als auch die kompatiblen Zerlegungen.Decomposition_Type
gibt an, ob es sich bei der Zerlegung um eine kanonische oder eine kompatible Zerlegung handelt. Im letzteren Fall wird auch angegeben, welcher Art diese ist.Canonical_Combining_Class
(kurz ccc
) ist eine Zahl zwischen 0 und 254, die für kombinierende Zeichen in etwa angibt, an welcher Stelle des Grundzeichens sie stehen. Haben zwei kombinierende Zeichen unterschiedliche Werte, so interagieren sie grafisch nicht miteinander und können vertauscht werden, ohne dass sich die Darstellung ändert.Full_Composition_Exclusion
-Eigenschaft, falls es zwar eine kanonische Zerlegung besitzt, aber in den zusammengesetzten Normalformen dennoch nicht verwendet werden soll.Hangul_Syllable_Type
wird bei für die Zerlegung koreanischer Silbenblöcke verwendet.Zur Überführung in eine der Normalformen führt man folgende Schritte durch:
Im ersten Schritt wird die Zeichenkette vollständig zerlegt: Zu jedem Zeichen wird ermittelt, ob eine Zerlegung existiert, und es wird gegebenenfalls durch diese ersetzt. Dieser Schritt ist wiederholt auszuführen, da die Zeichen, in die ein Zeichen zerlegt werden, selbst wieder zerlegbar sein können.
Für die kanonischen Normalformen werden nur kanonische Zerlegungen verwendet, bei kompatiblen Normalisierungen sowohl die kanonischen als auch die kompatiblen. Die Zerlegung koreanischer Silbenblöcke in einzelne Jamo wird dabei von einem gesonderten Algorithmus durchgeführt.
Anschließend werden die kombinierenden Zeichen, die zu dem gleichen Grundzeichen gehören, wie folgt sortiert: Folgen zwei Zeichen A und B aufeinander, für die gilt ccc(A) > ccc
(B) und ccc(B) > 0
, so werden diese beiden Zeichen vertauscht. Dieser Schritt wird so lange wiederholt, bis es keine benachbarten Zeichenpaare mehr gibt, die vertauscht werden können.
Für die zusammengesetzten Normalformen folgt ein dritter Schritt, die kanonische Komposition: Dazu wird (beginnend mit dem zweiten Zeichen) für jedes Zeichen C geprüft, ob ein vorhergehendes Zeichen L folgende Eigenschaften besitzt:
ccc
(L) = 0ccc
(A) < ccc
(C)Full_Composition_Exclusion
gekennzeichnet ist und die kanonische Zerlegung <L, C> besitzt.In diesem Fall wird L durch P ersetzt und C entfernt.
Um aus Folgen von Jamo wieder Silbenblöcke mit eigenen Unicode-Codepunkten zu erhalten, wird der Algorithmus zur Zerlegung der Silbenblöcke umgekehrt angewendet.
Text, der nur aus ASCII-Zeichen besteht, ist schon in jeder der Normalformen, Text aus Latin-1-Zeichen in NFC.
Die Verkettung zweier Zeichenketten in Normalform ist manchmal nicht in Normalform, ebenso kann ein Austausch von Klein- und Großbuchstabe die Normalform zerstören.
Alle Normalisierungen sind idempotent, wendet man sie also ein zweites Mal an, so bleibt die Zeichenkette wie sie ist. Jede Abfolge von Normalisierungen kann durch eine einzige Normalisierung ersetzt werden; das Ergebnis ist eine kompatible Normalisierung, falls eine der beteiligten Normalisierungen kompatibel ist, sonst eine kanonische.
Der Unicode-Standard stellt einige Eigenschaften zur Verfügung, dank denen effizient getestet werden kann, ob eine gegebene Zeichenkette in Normalform vorliegt oder nicht.
Zum Zwecke der Abwärtskompatibilität wird garantiert, dass eine Zeichenkette, die in einer Normalform vorliegt, auch in künftigen Versionen des Unicode-Standards in Normalform vorliegen wird, sofern sie keine bisher nicht zugewiesenen Zeichen enthält.[2]
Ab der Version 4.1 wird zusätzlich garantiert, dass sich auch die Normalisierung selbst nicht ändert. Davor hatte es einige Korrekturen gegeben, die dazu führten, dass manche Zeichenketten in unterschiedlichen Versionen unterschiedliche Normalformen besaßen.
Für Anwendungen, die auch über diese Versionsgrenze hinweg absolute Stabilität benötigen, gibt es einfache Algorithmen, um zwischen den Normalisierungen zu wechseln.
Die meistverbreitete Normalform in Anwendungen ist NFC. Sie wird unter anderem vom World Wide Web Consortium für XML und HTML empfohlen[3] und auch für JavaScript verwendet,[4] indem der Code vor weiterer Verarbeitung in diese Form überführt wird.
Die kanonischen Normalisierungen stellen sicher, dass äquivalente Daten nicht in unterschiedliche Formen persistiert werden, und gewährleisten damit eine konsistente Datenhaltung.
Die kompatiblen Normalisierungen können etwa für eine Suche verwendet werden, bei der es auf kleine optische Differenzen nicht ankommen soll. Allgemeine Normalisierungen können auf den Unicode-Normalisierungen aufbauen.
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.