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

前端之家收集整理的这篇文章主要介绍了Swift中的字符串和字符比较对区域设置不敏感是什么意思?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我开始学习 Swift语言,我很好奇 Swift中的字符串和字符比较对语言环境不敏感是什么意思?这是否意味着所有字符都像UTF-8字符一样存储在Swift中?
(现在为Swift 3更新了所有代码示例.)

将Swift字符串与<比较做词典比较
基于所谓的“Unicode Normalization Form D”(可以用.计算)
decomposedStringWithCanonicalMapping)

例如,分解

  1. "ä" = U+00E4 = LATIN SMALL LETTER A WITH DIAERESIS

是两个Unicode代码点的序列

  1. U+0061,U+0308 = LATIN SMALL LETTER A + COMBINING DIAERESIS

出于演示目的,我编写了一个小的String扩展来转储
String的内容作为Unicode代码点的数组:

  1. extension String {
  2. var unicodeData : String {
  3. return self.unicodeScalars.map {
  4. String(format: "%04X",$0.value)
  5. }.joined(separator: ",")
  6. }
  7. }

现在让我们拿一些字符串,用<:对它们进行排序

  1. let someStrings = ["ǟψ","äψ","ǟx","äx"].sorted()
  2. print(someStrings)
  3. // ["a","ã","ă","ä","ǟ","b"]

并转储每个字符串的Unicode代码点(原始和分解
form)在排序数组中:

  1. for str in someStrings {
  2. print("\(str) \(str.unicodeData) \(str.decomposedStringWithCanonicalMapping.unicodeData)")
  3. }

输出

  1. äx 00E4,0078 0061,0308,0078
  2. ǟx 01DF,0304,0078
  3. ǟψ 01DF,03C8 0061,03C8
  4. äψ 00E4,03C8

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

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

  1. let someStrings = ["ǟψ","äx"].sorted()

上面循环的输出

  1. äx 00E4,03C8

意思就是

  1. "äx" < "ǟx",but "äψ" > "ǟψ"

(这对我来说至少是意料之外的).

最后让我们将它与区域敏感的排序进行比较,例如瑞典语:

  1. let locale = Locale(identifier: "sv") // svenska
  2. var someStrings = ["ǟ","a","b"]
  3. someStrings.sort {
  4. $0.compare($1,locale: locale) == .orderedAscending
  5. }
  6.  
  7. print(someStrings)
  8. // ["a","b","ǟ"]

如您所见,结果与Swift<排序.

猜你在找的Swift相关文章