-1

https://docs.swift.org/swift-book/LanguageGuide/StringsAndCharacters.html说:

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

扩展字形簇是什么意思?

4

1 回答 1

3

正如您所引用的文档中提到的那样:

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

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

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

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

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

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 标准中的一种文本分割算法。未编码的 Unicode 文本是一系列 Unicode 代码点。文本分割算法分析此序列并识别“可见字符”(也称为“扩展字素簇”)的边界。

如果您对细节感兴趣,可以从Unicode 术语表开始。

于 2021-03-24T21:58:26.447 回答