Ich habe angefangen Swift zu lernen und bin sehr neugierig. Was bedeutet es, dass String- und Zeichenvergleiche in Swift nicht lokal-sensitiv sind? Bedeutet das, dass alle Zeichen in Swift wie UTF-8-Zeichen gespeichert sind?
(Alle Codebeispiele wurden jetzt für Swift 3 aktualisiert.)
Vergleiche Swift Strings mit <
macht einen lexikografischen Vergleich
basierend auf dem sogenannten "Unicode Normalization Form D" (welches mit berechnet werden kann)
decomposedStringWithCanonicalMapping
)
Zum Beispiel die Dekomposition von
%Vor%ist die Folge von zwei Unicode-Codepunkten
%Vor%Zu Demonstrationszwecken habe ich eine kleine String-Erweiterung geschrieben, die den Inhalt des Strings als Array von Unicode-Codepunkten:
%Vor% Nun nehmen wir ein paar Strings und sortieren sie mit <
:
und speichern Sie die Unicode-Codepunkte jeder Zeichenfolge (im Original und in der Zerlegung) Form) im sortierten Array:
%Vor%Die Ausgabe
%Vor%zeigt gut, dass der Vergleich durch eine lexikographische Ordnung des Unicodes erfolgt Codepunkte in der zerlegten Form.
Dies gilt auch für Strings mit mehr als einem Zeichen, wie das folgende Beispiel zeigt zeigt an. Mit
%Vor%Die Ausgabe der obigen Schleife ist
%Vor%was bedeutet, dass
%Vor%(was zumindest für mich unerwartet war).
Vergleichen wir dies zum Schluss mit einer für das Gebietsschema empfindlichen Sortierung, zum Beispiel Schwedisch:
%Vor% Wie Sie sehen, unterscheidet sich das Ergebnis von der Sortierung Swift <
.
Das Ändern des Gebietsschemas kann die alphabetische Reihenfolge ändern, z. Bei einem Vergleich zwischen Groß- / Kleinschreibung kann die Groß- / Kleinschreibung nicht beachtet werden, oder allgemeiner gesagt, die alphabetische Reihenfolge zweier Zeichenfolgen ist unterschiedlich.
Die lexikographische Anordnung und die ortsspezifische Reihenfolge können unterschiedlich sein. Sie können ein Beispiel dafür in dieser Frage sehen: Sortierung scala-Liste entspricht zu C #, ohne C # Reihenfolge zu ändern
In diesem speziellen Fall hat die locale-sensitive Reihenfolge _
vor 1
platziert, während in einer lexikographischen Anordnung das Gegenteil der Fall ist.
Swift Vergleich verwendet lexikographische Reihenfolge.