2016-01-31 5 views
5

Elsewhere I've seen it told, dass Swifts Vergleiche NFD-Normalisierung verwenden.Welche Art von Normalisierung wird von Swift String-Vergleichen verwendet?

jedoch running in the iSwift playground Ich habe festgestellt, dass

print("\u{0071}\u{0307}\u{0323}" == "\u{0071}\u{0323}\u{0307}"); 

gibt false trotz this being an example straight from the standard von "Canonical Equivalence", die Swift's documentation claims to follow.

Also, welche Art von Kanonisierung ist durchgeführt von Swift, und ist das ein Fehler?

+0

Gute Frage! Wie ich die Dokumentation verstehe, sollte '\ u {0071} \ u {0307} \ u {0323}". PrecomposedStringWithCanonicalMapping '' \ u {0071} \ u {0323} \ u {0307} "' zurückgeben , dh das NFC-Formular mit den Kombinationsmarken in einer definierten Reihenfolge. Aber das tut es nicht, wie man mit 'print (Array (string.unicodeScalars)) bestätigen kann. –

+1

Gibt der [Quellcode] (https://github.com/apple/swift/blob/master/stdlib/public/core/String.swift) einen Hinweis? "* Die Strings, die nach ihrer NFD-Form entsprechen, werden als gleich angesehen. ... *" - Wie ich es verstehe, haben Ihre Strings die gleiche NFC-Form, aber unterschiedliche NFD-Form. –

+0

@MartinR Es ist nicht NFD vs. NFC, da NFC ist nur NFD gefolgt von "Canonical Composition", die nach der Neuordnung passiert (was abgeleitet ist "Die vollständig zerlegt und kanonisch geordnete Zeichenfolge wird von einem anderen Teil des Unicode Normalization-Algorithmus verarbeitet bekannt als der Canonical Composition Algorithm. ") Ich habe das Verhalten gegen Pythons" unicodedata.normalize "überprüft, und Python scheint zuzustimmen, dass NFD neu ordnen sollte. – Veedrac

Antwort

2

Es scheint, dass dies im Fehler in Swift war, der seither behoben wurde. Mit Swift 3 und Xcode 8.0,

print("\u{0071}\u{0307}\u{0323}" == "\u{0071}\u{0323}\u{0307}") 

druckt jetzt true.

Verwandte Themen