Alles, was Sie nie über Unicode-Normalisierung wissen wollten
Kanonische Normalisierung
Unicode bietet mehrere Möglichkeiten zum Codieren einiger Zeichen, insbesondere von Zeichen mit Akzent. Die kanonische Normalisierung ändert die Codepunkte in eine kanonische Codierungsform. Die resultierenden Codepunkte sollten mit den ursprünglichen identisch sein, mit Ausnahme von Fehlern in den Schriftarten oder der Rendering-Engine.
Wann zu verwenden
Da die Ergebnisse identisch erscheinen, ist es immer sicher, eine kanonische Normalisierung auf eine Zeichenfolge anzuwenden, bevor diese gespeichert oder angezeigt wird, solange Sie tolerieren können, dass das Ergebnis nicht Bit für Bit mit der Eingabe identisch ist.
Die kanonische Normalisierung erfolgt in zwei Formen: NFD und NFC. Die beiden sind in dem Sinne äquivalent, dass man ohne Verlust zwischen diesen beiden Formen konvertieren kann. Der Vergleich zweier Zeichenfolgen unter NFC führt immer zum gleichen Ergebnis wie der Vergleich unter NFD.
NFD
NFD hat die Zeichen vollständig erweitert. Dies ist die schnellere zu berechnende Normalisierungsform, die jedoch zu mehr Codepunkten führt (dh mehr Platz benötigt).
Wenn Sie nur zwei Zeichenfolgen vergleichen möchten, die noch nicht normalisiert sind, ist dies die bevorzugte Normalisierungsform, es sei denn, Sie wissen, dass Sie eine Kompatibilitätsnormalisierung benötigen.
NFC
NFC kombiniert Codepunkte nach Möglichkeit neu, nachdem der NFD-Algorithmus ausgeführt wurde. Dies dauert etwas länger, führt jedoch zu kürzeren Saiten.
Kompatibilitätsnormalisierung
Unicode enthält auch viele Zeichen, die wirklich nicht dazu gehören, aber in älteren Zeichensätzen verwendet wurden. Unicode fügte diese hinzu, damit Text in diesen Zeichensätzen als Unicode verarbeitet und dann ohne Verlust zurückkonvertiert werden kann.
Die Kompatibilitätsnormalisierung konvertiert diese in die entsprechende Folge von "echten" Zeichen und führt auch eine kanonische Normalisierung durch. Die Ergebnisse der Kompatibilitätsnormalisierung sind möglicherweise nicht mit den Originalen identisch.
Zeichen, die Formatierungsinformationen enthalten, werden durch Zeichen ersetzt, die dies nicht tun. Zum Beispiel wird der Charakter in ⁹
konvertiert 9
. Andere beinhalten keine Formatierungsunterschiede. Beispielsweise wird das römische Ziffernzeichen Ⅸ
in reguläre Buchstaben umgewandelt IX
.
Sobald diese Transformation durchgeführt wurde, ist es offensichtlich nicht mehr möglich, verlustfrei zum ursprünglichen Zeichensatz zurückzukehren.
Wann zu verwenden
Das Unicode-Konsortium schlägt vor, die Kompatibilitätsnormalisierung wie eine ToUpperCase
Transformation zu betrachten. Es ist etwas, das unter bestimmten Umständen nützlich sein kann, aber Sie sollten es nicht einfach so oder so anwenden.
Ein ausgezeichneter Anwendungsfall wäre eine Suchmaschine, da Sie wahrscheinlich eine 9
passende Suche wünschen würden ⁹
.
Eine Sache, die Sie wahrscheinlich nicht tun sollten, ist das Ergebnis der Anwendung der Kompatibilitätsnormalisierung auf den Benutzer anzuzeigen.
NFKC / NFKD
Das Kompatibilitätsnormalisierungsformular gibt es in zwei Formen: NFKD und NFKC. Sie haben die gleiche Beziehung wie zwischen NFD und C.
Jede Zeichenfolge in NFKC ist von Natur aus auch in NFC enthalten, und dies gilt auch für NFKD und NFD. Also NFKD(x)=NFD(NFKC(x))
und NFKC(x)=NFC(NFKD(x))
usw.
Fazit
Wenn Sie Zweifel haben, fahren Sie mit der kanonischen Normalisierung fort. Wählen Sie NFC oder NFD basierend auf dem anwendbaren Kompromiss zwischen Platz und Geschwindigkeit oder basierend auf den Anforderungen, die für etwas erforderlich sind, mit dem Sie zusammenarbeiten.