就Swift String而言,“扩展的字素簇在规范上是等效的”是什么意思?

时间:2019-03-28 02:46:41

标签: swift

如果两个字符串值(或两个字符值)的扩展字素簇规范相等,则认为它们相等。如果扩展字素簇具有相同的语言含义和外观,即使它们是由幕后的不同Unicode标量组成的,它们在规范上也是等效的。

扩展字素簇是什么意思?

1 个答案:

答案 0 :(得分:3)

正如您在引用的 document 中提到的:

<块引用>

扩展字素簇是一个或多个 Unicode 标量的序列,(组合时)产生一个人类可读的字符。

也就是说,一个扩展的字素簇是一个单一的“可见字符”,通常,在文本编辑器中,光标会在它周围跳跃。

例如,ёё 看起来都一样,每一个都是一个扩展的字素簇,但第一个是由单个 Unicode 标量(或代码点)产生的,而第二个一对二:

  • ё = [ё CYRILLIC SMALL LETTER IO]
  • ё = [е CYRILLIC SMALL LETTER IE, "̈ COMBINING DIAERESIS]

ёё 在规范上是等价的,因此,即使它们是由不同的 Unicode 代码点序列产生的,它们也被认为是相等的(例如,-[NSString isEqualToString:]比较确切的 UTF-16 代码单元):

let e1 = "ё"
let e2 = "ё"

e1.unicodeScalars.count // 1
e2.unicodeScalars.count // 2
e1 == e2 // true, because Swift String uses canonical equivalence
(e1 as NSString).isEqual(to: e2) // false, because NSString compares UTF-16 code units

准确地说,“扩展字素簇”是来自Unicode standard的文本分割算法之一。未编码的 Unicode 文本是一系列 Unicode 代码点。文本分割算法分析该序列并识别“可见字符”(也称为“扩展字素簇”)的边界。

如果您对细节感兴趣,最好从 Glossary of Unicode Terms 开始。