首页 > 代码库 > Welcome to Swift (苹果官方Swift文档初译与注解二十)---133~139页(第二章..本节完)
Welcome to Swift (苹果官方Swift文档初译与注解二十)---133~139页(第二章..本节完)
Unicode (Unicode码)
Unicode是一种国际标准的文本编码.它的标准表中几乎包含所有语言的任意字符,并且可以通过扩展文件或者网页读写这些字符.
在Swift中,String(字符串)类型和Character(字符)类型完全兼容Unicode,而且它们也支持非Unicode码.
Unicode Terminology (Unicode 术语)
每个Unicode码都可以用一个或者多个Unicode标量表示.对于一个字符来说,一个Unicode标量都是一个唯一的21位的值(或名称),例如“ U+0061 表示 LOWERCASE LATIN LETTER A ("a"),或者U+1F425 表示 FRONT-FACING BABY CHICK ("??").
当一个Unicode字符串以文本文件或其他方式存储的时候,它们的Unicode标量也会以按照Unicode定义的格式进行编码.每种格式都使用叫做编码单元(code unit)的块来编码字符串. 这些格式里包括UTF-8格式(使用八位编码单元编码一个字符串)和UTF-16格式(使用十六位编码单元编码一个字符串)
Unicode Representations of Strings (字符串的Unicode表示)
在Swift中,提供了几种不同的存取Unicode形式的字符串.
你可以使用for-in语句来遍历字符串,来存取每个Unicode字符的字符值.
或者也可以用下面的三种方式中的一个来存取Unicode字符串类型的值.
- UTF-8 code units (使用字符串的 utf8 属性存取)
- UTF-16 code units (使用字符串的 utf16 属性存取)
- UTF-21 code units (使用字符串的 unicodeScalars 属性存取)
下面的每个例子演示了字符串”Dog!??”的不同表示方式:
let dogString = "Dog!??"
UTF-8
使用utf8的属性可以按照UTF-8的形式来访问字符串.utf8属性的类型是UTF8View,它是一组无符号的8位数值(UInt8),每个值代表UTF-8的一个字节.
for codeUnit in dogString.utf8 {
print("\(codeUnit) ")
}
print("\n")
// 68 111 103 33 240 159 144 182
在这个例子中,codeUnit的前四个十进制的值(68 111 103 33)分别表示字符D,o,g和!.这与ASCII是一样的.codeUnit的后四个值(240 159 144 182)代表字符DOG FACE的UTF-8 四字节形式.
UTF-16
使用字符串的utf16属性,可以按照UTF16方式存取字符串. utf16属性的类型是UTF16View,它是一组无符号16位数值(UInt16),一个值代表UTF16中的一个16位编码单元:
for codeUnit in dogString.utf16 {
print("\(codeUnit) ")
}
print("\n")
// 68 111 103 33 55357 5637
同样的,codeUnit的前四个值(68 111 103 33)表示字符D,o,g和!.这些和UTF-8是相同的.
codeUnit的第十五和第十六个值是DOG FACE 的UTF-16替代表示:U+D83D(十进制值为55357)和U+DC36(十进制值为56374).
Unicode Scalars (Unicode 标量)
通过unicodeScalars属性也可以访问存取字符串,这个属性的类型是UnicodeScalarView.
每个 UnicodeScalar 都有一个value属性,它是一个UInt32的值,
for scalar in dogString.unicodeScalars {
print("\(scalar.value) ")
}
print("\n")
// 68 111 103 33 128054
UnicodeScalar的value属性的前四个值(68 111 103 33)与前面的两个例子相同,都是表示字符D,o,g和!,最后的值128054(十进制)是十六进制的1F436,表示 DOG FACE.
通过value属性,每个UnicodeScalar的值也可以用来构建一个新的字符串:
for scalar in dogString.unicodeScalars {
println("\(scalar) ")
}
// D
// o
// g
// !
// ??”