Freigeben über


Normalisierung und Sortierung

Einige Unicode-Zeichen haben mehrere entsprechende binäre Darstellungen, die aus Sätzen von verbindenden und/oder zusammengesetzten Unicode-Zeichen bestehen. Infolgedessen können zwei Zeichenfolgen gleich aussehen, aber tatsächlich aus unterschiedlichen Zeichen bestehen. Das Vorhandensein mehrerer Darstellungen für ein einzelnes Zeichen erschwert Sortiervorgänge. Die Lösung dieses Problems besteht in der Normalisierung aller Zeichenfolgen, die dann mit einem Ordinalvergleich sortiert werden.

Der Unicode-Standard definiert einen als Normalisierung bezeichneten Prozess, der eine binäre Darstellung eines Zeichens zurückgibt, wenn eine der gleichwertigen binären Darstellungen des Zeichens übergeben wird. Der Unicode-Standard definiert vier verschiedene Algorithmen, so genannte Normalisierungsformen, die zum Normalisieren einer Zeichenfolge verwendet werden können. Jede Normalisierungsform unterliegt anderen Regeln und ergibt deshalb eine andere binäre Darstellung einer Eingabezeichenfolge. Wenn jedoch zwei Zeichenfolgen mit der gleichen Normalisierungsform normalisiert werden, können die Zeichenfolgen in der Folge mit einem Ordinalvergleich (ohne Berücksichtigung der Groß-/Kleinschreibung) verglichen werden.

Ein Ordinalvergleich zweier Zeichenfolgen stellt einen Binärvergleich des numerischen Werts, des so genannten Codepunkts, aller Paare aus entsprechenden Char-Strukturen in den beiden String-Objekten, die die normalisierten Zeichenfolgen darstellen. .NET Framework stellt mehrere Methoden bereit, die einen Ordinalvergleich ausführen können.

Die Anwendung kann den folgenden Prozess verwenden, um Zeichenfolgen zu normalisieren und zu sortieren:

  1. Rufen Sie zwei zu sortierende Zeichenfolgen aus einer Eingabequelle ab, z. B. einer Datei oder einer Benutzereingabe.

  2. Verwenden Sie die String.Normalize()-Methode, um beide Zeichenfolgen in die Normalisierungsform C zu normalisieren, oder verwenden Sie die String.Normalize(NormalizationForm)-Methode, um beide Zeichenfolgen in einer Normalisierungsform Ihrer Wahl zu normalisieren.

  3. Verwenden Sie einen Zeichenfolgenvergleich nach Ordinalwerten, z. B. die Compare(String, Int32, String, Int32, Int32, StringComparison)-Methode mit einem Ordinal-Wert oder einem OrdinalIgnoreCase-Wert, um die beiden Zeichenfolgen zu vergleichen. Die Vergleichsoperation bestimmt, ob die erste Zeichenfolge lexikalisch der zweiten Zeichenfolge vorangeht oder ob die beiden Zeichenfolgen lexikalisch gleich sind.

  4. Geben Sie die Zeichenfolgen in der sortierten Ausgabe auf Grundlage der Ergebnisse aus Schritt 3 aus. Wenn die Zeichenfolgen nicht gleich sind, geben Sie die Zeichenfolgen in der Reihenfolge aus, mit der eine aufsteigende oder absteigende Reihenfolge erreicht werden kann.

    Wenn die Zeichenfolgen gleich sind, kann jede der Zeichenfolgen zuerst ausgegeben werden, sofern es nicht sinnvoll ist, die Zeichenfolgen nach einem anderen Kriterium als der lexikalischen Reihenfolge anzuordnen. Wenn die Anwendung beispielsweise Dateinamen sortiert, aber auch jeweils die Dateieigenschaften in die Ausgabe schreibt, können gleiche Dateinamen in der Reihenfolge ihrer Erstellung geschrieben werden.

  5. Wiederholen Sie diesen Prozess, bis die gesamte Eingabe sortiert ist.

Weitere Informationen über die Unterstützung von Normalisierungsformen in .NET Framework finden Sie in der Beschreibung der NormalizationForm-Enumeration. Weitere Informationen über das Normalisieren einer Zeichenfolge finden Sie unter der Normalize-Methode.

Weitere Informationen zur Normalisierung, zu Zeichenauflösungen und Äquivalenz finden Sie im Standard für Unicode, Annex 15, "Unicode Normalization Forms" auf der Unicode-Homepage (auf Englisch).

Siehe auch

Konzepte

Sortieren mit Kulturen

Vergleichen und Sortieren von Daten für eine bestimmte Kultur

Weitere Ressourcen

Codierung und Lokalisierung