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}");
dà 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?
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))'. –
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. –
@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