Unicode是一个用于在不同书写系统中对文本进行编码、表示和处理的国际标准。它使你可以用标准格式表示来自任意语言几乎所有的字符,并能够对文本文件或网页这样的外部资源中的字符进行读写操作。Swift的String和Character类型是完全兼容Unicode标准的。
Unicode标量
Swift的String类型是基于Unicode标量建立的。Unicode标量是对应字符或者修饰符的唯一的21位数字,例如U+0061表示小写的拉丁字母(LATIN SMALL LETTER A)("a"),U+1F425表示小鸡表情(FRONT-FACING BABY CHICK)("🐥")。
请注意,并非所有21位Unicode标量值都分配给字符,某些标量被保留用于将来分配或用于UTF-16编码。已分配的标量值通常也有一个名称,例如上面示例中的LATIN SMALL LETTER A 和 FRONT-FACING BABY CHICK。
可扩展的字形群集
每一个Swift的Character类型代表一个可扩展的字形群。而一个可扩展的字形群构成了人类可读的单个字符,它由一个或多个(当组合时)Unicode标量的序列组成。
举个例子,字母é可以用单一的Unicode标量é(LATIN SMALL LETTER E WITH ACUTE,或者 U+00E9)来表示。然而一个标准的字母e(LATIN SMALL LETTER E 或者 U+0065)加上一个急促重音(COMBINING ACTUE ACCENT)的标量(U+0301),这样一对标量就表示了同样的字母é。这个急促重音的标量形象将e转换成了é。
在这两种情况中,字母 é代表了一个单一的Swift的Character值,同时代表了一个可扩展的字形群。在第一种情况,这个字形群包含一个单一标量;而在第二种情况,它是包含两个标量的字形群。
// é let eAcute:Character = "\u{E9}" //e后面加上 ́ let combinedEAcute:Character = "\u{65}\u{301}" // eAcute是é,combinedEAcute是é
可扩展的字形集是一个将许多复杂的脚本字符表示为单个字符值的灵活方式。例如,来自朝鲜语字母表的韩语音节能表示为组合或分解的有序排列。在Swift都会表示为同一个单一的Character值。
//한 let precomposed:Character = "\u{D55C}" //ᄒ, ᅡ, ᆫ let decomposed:Character = "\u{1112}\u{1161}\u{11AB}" //precomposed 是 한, decomposed 是 한
可拓展的字符群集可以使包围记号(例如COMBINING ENCLOSING CIRCLE 或者 U+20DD)的标量包围其他Unicode标量,作为一个单一的Character值。
//enclosedEAcute是 é⃝ let enclosedEAcute:Character = "\u{E9}\u{20DD}"
地域性指示符号的Unicode标量可以组合成一个单一的Character值。
REGIONAL INDICATOR SYMBOL LETTER U(U+1F1FA)和
REGIONAL INDICATOR SYMBOL LETTER S(U+1F1F8)。
//regionalIndicatorForUS是🇺🇸 let regionalIndicatorForUS:Character = "\u{1F1FA}\u{1F1F8}"