3 回答

TA貢獻1883條經驗 獲得超3個贊
比較Swift字符串<與會根據所謂的“ Unicode規范化形式D”(可以通過計算 decomposedStringWithCanonicalMapping)進行詞典上的比較
例如,分解
"?" = U+00E4 = LATIN SMALL LETTER A WITH DIAERESIS
是兩個Unicode代碼點的序列
U+0061,U+0308 = LATIN SMALL LETTER A + COMBINING DIAERESIS
出于演示目的,我編寫了一個小的String擴展名,該擴展名將String的內容轉儲為Unicode代碼點的數組:
extension String {
var unicodeData : String {
return self.unicodeScalars.map {
String(format: "%04X", $0.value)
}.joined(separator: ",")
}
}
現在,讓我們來一些字符串,用<:
let someStrings = ["?ψ", "?ψ", "?x", "?x"].sorted()
print(someStrings)
// ["a", "?", "?", "?", "?", "b"]
并將每個字符串(原始和分解形式)的Unicode代碼點轉儲到排序數組中:
for str in someStrings {
print("\(str) \(str.unicodeData) \(str.decomposedStringWithCanonicalMapping.unicodeData)")
}
輸出
?x 00E4,0078 0061,0308,0078
?x 01DF,0078 0061,0308,0304,0078
?ψ 01DF,03C8 0061,0308,0304,03C8
?ψ 00E4,03C8 0061,0308,03C8
很好地顯示了比較是通過分解形式的Unicode代碼點的字典順序進行的。
如以下示例所示,對于多個字符的字符串也是如此。用
let someStrings = ["?ψ", "?ψ", "?x", "?x"].sorted()
以上循環的輸出是
?x 00E4,0078 0061,0308,0078
?x 01DF,0078 0061,0308,0304,0078
?ψ 01DF,03C8 0061,0308,0304,03C8
?ψ 00E4,03C8 0061,0308,03C8
意思就是
"?x" < "?x", but "?ψ" > "?ψ"
(這至少對我來說是出乎意料的)。
最后,讓我們將其與語言環境敏感的順序進行比較,例如瑞典語:
let locale = Locale(identifier: "sv") // svenska
var someStrings = ["?", "?", "?", "a", "?", "b"]
someStrings.sort {
$0.compare($1, locale: locale) == .orderedAscending
}
print(someStrings)
// ["a", "?", "?", "b", "?", "?"]
如您所見,結果與Swift <排序不同。

TA貢獻1834條經驗 獲得超8個贊
詞典順序和區分區域的順序可以不同。您可以在以下問題中看到它的一個示例:在 不更改C#順序的情況下,對等價于C#的scala列表進行排序
在這種特定情況下,對語言環境敏感的順序位于_之前1,而在字典順序中則相反。
快速比較使用字典順序。
- 3 回答
- 0 關注
- 605 瀏覽
添加回答
舉報