标签:
Unicode 是一个国际标准,用于文本的编码和表示。 它使您可以用标准格式表示来自任意语言几乎所有的字符,并能够对文本文件或网页这样的外部资源中的字符进行读写操作。 Swift 的String
和Character
类型是完全兼容 Unicode 标准的。
Swift 的String
类型是基于 Unicode 标量 建立的。 Unicode 标量是对应字符或者修饰符的唯一的21位数字,例如U+0061
表示小写的拉丁字母(LATIN SMALL LETTER A
)("a
"),U+1F425
表示小鸡表情(FRONT-FACING BABY CHICK
) ("??
")。
注意: Unicode 码位(code poing) 的范围是
U+0000
到U+D7FF
或者U+E000
到U+10FFFF
。Unicode 标量不包括 Unicode 代理项(surrogate pair) 码位,其码位范围是U+D800
到U+DFFF
。
注意不是所有的21位 Unicode 标量都代表一个字符,因为有一些标量是留作未来分配的。已经代表一个典型字符的标量都有自己的名字,例如上面例子中的LATIN SMALL LETTER A
和FRONT-FACING BABY CHICK
。
字符串字面量可以包含以下特殊字符:
\0
(空字符)、\\
(反斜线)、\t
(水平制表符)、\n
(换行符)、\r
(回车符)、\"
(双引号)、\‘
(单引号)。\u{n}
(u为小写),其中n
为任意一到八位十六进制数且可用的 Unicode 位码。下面的代码为各种特殊字符的使用示例。 wiseWords
常量包含了两个双引号。 dollarSign
、blackHeart
和sparklingHeart
常量演示了三种不同格式的 Unicode 标量:
let wiseWords = "\"Imagination is more important than knowledge\" - Einstein" // "Imageination is more important than knowledge" - Enistein let dollarSign = "\u{24}" // $, Unicode 标量 U+0024 let blackHeart = "\u{2665}" // ♥, Unicode 标量 U+2665 let sparklingHeart = "\u{1F496}" // ??, Unicode 标量 U+1F496
每一个 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}" // é let combinedEAcute: Character = "\u{65}\u{301}" // e 后面加上 ? // eAcute 是 é, combinedEAcute 是 é
可扩展的字符群集是一个灵活的方法,用许多复杂的脚本字符表示单一的Character
值。 例如,来自朝鲜语字母表的韩语音节能表示为组合或分解的有序排列。 在 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
值:
let enclosedEAcute: Character = "\u{E9}\u{20DD}" // enclosedEAcute 是 é?
局部的指示符号的 Unicode 标量可以组合成一个单一的Character
值,例如REGIONAL INDICATOR SYMBOL LETTER U
(U+1F1FA
)和REGIONAL INDICATOR SYMBOL LETTER S
(U+1F1F8
):
let regionalIndicatorForUS: Character = "\u{1F1FA}\u{1F1F8}" // regionalIndicatorForUS 是 ????
如果想要获得一个字符串中Character
值的数量,可以使用字符串的characters
属性的count
属性:
let unusualMenagerie = "Koala ??, Snail ??, Penguin ??, Dromedary ??" print("unusualMenagerie has \(unusualMenagerie.characters.count) characters") // 打印输出 "unusualMenagerie has 40 characters"
注意在 Swift 中,使用可拓展的字符群集作为Character
值来连接或改变字符串时,并不一定会更改字符串的字符数量。
例如,如果你用四个字符的单词cafe
初始化一个新的字符串,然后添加一个COMBINING ACTUE ACCENT
(U+0301
)作为字符串的结尾。最终这个字符串的字符数量仍然是4
,因为第四个字符是é
,而不是e
:
var word = "cafe" print("the number of characters in \(word) is \(word.characters.count)") // 打印输出 "the number of characters in cafe is 4" word += "\u{301}" // COMBINING ACUTE ACCENT, U+0301 print("the number of characters in \(word) is \(word.characters.count)") // 打印输出 "the number of characters in café is 4"
注意: 可扩展的字符群集可以组成一个或者多个 Unicode 标量。这意味着不同的字符以及相同字符的不同表示方式可能需要不同数量的内存空间来存储。所以 Swift 中的字符在一个字符串中并不一定占用相同的内存空间数量。因此在没有获取字符串的可扩展的字符群的范围时候,就不能计算出字符串的字符数量。如果您正在处理一个长字符串,需要注意
characters
属性必须遍历全部的 Unicode 标量,来确定字符串的字符数量。另外需要注意的是通过
characters
属性返回的字符数量并不总是与包含相同字符的NSString
的length
属性相同。NSString
的length
属性是利用 UTF-16 表示的十六位代码单元数字,而不是 Unicode 可扩展的字符群集。作为佐证,当一个NSString
的length
属性被一个Swift的String
值访问时,实际上是调用了utf16Count
。
Swift学习笔记-字符串和字符(Strings and Characters)-Unicode
标签:
原文地址:http://www.cnblogs.com/emmet7life/p/4895431.html