2016-01-31 41 views
5

Elsewhere I've seen it told che i confronti di Swift utilizzano la normalizzazione NFD.Che tipo di normalizzazione viene utilizzata dai confronti delle stringhe Swift?

Tuttavia, running in the iSwift playground ho trovato che

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

false, nonostante this being an example straight from the standard di "Canonical equivalenza", che Swift's documentation claims to follow.

Quindi, che tipo di canonizzazione è eseguita da Swift e si tratta di un errore?

+0

Buona domanda! Inoltre, come ho capito la documentazione, '" \ u {0071} \ u {0307} \ u {0323} ". PrecomposedStringWithCanonicalMapping' dovrebbe restituire' "\ u {0071} \ u {0323} \ u {0307}" ' , cioè la forma NFC con i segni di combinazione in un ordine definito. Ma non è così, come si può verificare con 'print (Array (string.unicodeScalars))'. –

+1

Il [codice sorgente] (https://github.com/apple/swift/blob/master/stdlib/public/core/String.swift) fornisce un indizio? "* Le stringhe che sono equivalenti in base allo al loro modulo NFD sono considerate uguali. ... *" - A quanto ho capito, le stringhe hanno lo stesso modulo NFC, ma un diverso modulo NFD. –

+0

@MartinR Non è NFD contro NFC, poiché NFC è solo NFD seguito da "Composizione canonica", che avviene dopo il riordino (che è dedotto da "La stringa completamente decomposta e ordinata canonicamente viene elaborata da un'altra sottoparte dell'algoritmo di normalizzazione Unicode noto come Algoritmo di composizione canonica. ") Ho controllato il comportamento rispetto a' unicodedata.normalize' di Python, e Python sembra essere d'accordo sul fatto che NFD debba riordinare. – Veedrac

risposta

2

Sembra che questo fosse in errore in Swift che è stato risolto. Con Swift 3 e Xcode 8.0,

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

ora stamperà true.