Was bedeutet es, dass String- und Zeichenvergleiche in Swift nicht länderspezifisch sind?

7

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?

    
Dmytro Plekhotkin 07.09.2014, 19:30
quelle

3 Antworten

18

(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 < :

%Vor%

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 < .

    
Martin R 10.09.2014, 21:07
quelle
1

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.

    
Miro Lehtonen 07.09.2014 19:36
quelle
1

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.

    
Gabriele Petronella 07.09.2014 19:49
quelle

Tags und Links