3 回答

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

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超6個(gè)贊
更改語(yǔ)言環(huán)境可以更改字母順序,例如,由于語(yǔ)言環(huán)境的原因,區(qū)分大小寫的比較可能會(huì)不區(qū)分大小寫,或更一般而言,兩個(gè)字符串的字母順序是不同的。

TA貢獻(xiàn)1834條經(jīng)驗(yàn) 獲得超8個(gè)贊
詞典順序和區(qū)分區(qū)域的順序可以不同。您可以在以下問(wèn)題中看到它的一個(gè)示例:在 不更改C#順序的情況下,對(duì)等價(jià)于C#的scala列表進(jìn)行排序
在這種特定情況下,對(duì)語(yǔ)言環(huán)境敏感的順序位于_之前1,而在字典順序中則相反。
快速比較使用字典順序。
- 3 回答
- 0 關(guān)注
- 602 瀏覽
添加回答
舉報(bào)