2016-01-31 15 views
5

Elsewhere I've seen it told że porównania Swift używają normalizacji NFD.Jakiego rodzaju normalizacji używają porównania łańcuchów Swift?

Jednak running in the iSwift playground Znalazłem że

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

daje false mimo this being an example straight from the standard o równoważności "kanonicznej", który Swift's documentation claims to follow.

Więc, jaki rodzaj kanonizacji jest wykonywany przez Swift i czy to błąd?

+0

Dobre pytanie! Ponadto, jak rozumiem dokumentacji, "\ u {0071} \ u {0307} \ u {0323}". PrecomposedStringWithCanonicalMapping "powinien zwrócić' "\ u {0071} \ u {0323} \ u {0307}" ' , tj. formularz NFC ze znakami łączącymi w określonej kolejności. Ale tak nie jest, jak można to sprawdzić za pomocą 'print (Array (string.unicodeScalars))'. –

+1

Czy [kod źródłowy] (https://github.com/apple/swift/blob/master/stdlib/public/core/String.swift) daje wskazówkę? "* Struny, które są równoważne według do ich formy NFD, są uważane za równe. ... *" - Jak rozumiem, twoje struny mają taką samą formę NFC, ale różnią się formą NFD. –

+0

@MartinR To nie jest NFD kontra NFC, ponieważ NFC to po prostu NFD, po której następuje "Kompozycja kanoniczna", co dzieje się po zmianie kolejności (co wynika z "Całkowicie rozłożony i kanonicznie uporządkowany ciąg jest przetwarzany przez inną część Algorytmu Normalizacyjnego Unicode znany jako Kanoniczny Algorytm Kompozycji. ") Sprawdziłem zachowanie przed' unicodedata.normalize' w Pythonie, a Python wydaje się zgadzać, że NFD powinien zmienić kolejność. – Veedrac

Odpowiedz

2

Wygląda na to, że był to błąd w Swift, który został naprawiony. Szybkimi 3 i Xcode 8.0

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

Teraz drukuje true.

Powiązane problemy