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

Bab*_*shi 0 swift

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

\n
\n

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

\n
\n

扩展字素簇是什么意思?

\n

MAN*_*rii 5

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

\n
\n

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

\n
\n

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

\n

例如,\xd1\x91两者\xd0\xb5\xcc\x88看起来相同,每个都是扩展的字素簇,但第一个是由单个 Unicode 标量(或代码点)生成的,而第二个是由两个生成的:

\n
    \n
  • \xd1\x91= [ \xd1\x91 CYRILLIC SMALL LETTER IO]
  • \n
  • \xd0\xb5\xcc\x88= [ \xd0\xb5 CYRILLIC SMALL LETTER IE, "\xcc\x88 COMBINING DIAERESIS]
  • \n
\n

\xd1\x91\xd0\xb5\xcc\x88是规范上等价的,因此,即使它们是由不同的 Unicode 代码点序列生成的,它们也被认为是相等的(与例如比较精确 UTF-16 代码单元的-[NSString isEqualToString:]相反):

\n
let e1 = "\xd1\x91"\nlet e2 = "\xd0\xb5\xcc\x88"\n\ne1.unicodeScalars.count // 1\ne2.unicodeScalars.count // 2\ne1 == e2 // true, because Swift String uses canonical equivalence\n(e1 as NSString).isEqual(to: e2) // false, because NSString compares UTF-16 code units\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

如果您对详细信息感兴趣,可以从Glossary of Unicode terms开始。

\n