加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Swift中的字符串和字符比较对区域设置不敏感是什么意思?

发布时间:2020-12-14 05:27:46 所属栏目:百科 来源:网络整理
导读:我开始学习 Swift语言,我很好奇 Swift中的字符串和字符比较对语言环境不敏感是什么意思?这是否意味着所有字符都像UTF-8字符一样存储在Swift中? (现在为Swift 3更新了所有代码示例.) 将Swift字符串与比较做词典比较 基于所谓的“Unicode Normalization Form
我开始学习 Swift语言,我很好奇 Swift中的字符串和字符比较对语言环境不敏感是什么意思?这是否意味着所有字符都像UTF-8字符一样存储在Swift中?
(现在为Swift 3更新了所有代码示例.)

将Swift字符串与<比较做词典比较
基于所谓的“Unicode Normalization Form 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代码点(原始和分解
form)在排序数组中:

for str in someStrings {
    print("(str)  (str.unicodeData)  (str.decomposedStringWithCanonicalMapping.unicodeData)")
}

输出

?x  00E4,0078  0061,0308,0078
?x  01DF,0304,0078
?ψ  01DF,03C8  0061,03C8
?ψ  00E4,03C8

很好地表明,比较是通过Unicode的词典排序完成的
分解形式的代码点.

对于多个字符的字符串也是如此,如下例所示
显示.同

let someStrings = ["?ψ","?x"].sorted()

上面循环的输出是

?x  00E4,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<排序.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读