字符串的 Unicode 表示形式
当一个 Unicode 字符串被写进文本文件或者其他储存时,字符串中的 Unicode 标量会用 Unicode 定义的几种编码格式
(encoding forms)编码。每一个字符串中的小块编码都被称代码单元
(code units)。这些包括 UTF-8 编码格式(编码字符串为8位的代码单元), UTF-16 编码格式(编码字符串位16位的代码单元),以及 UTF-32 编码格式(编码字符串32位的代码单元)。
Swift 提供了几种不同的方式来访问字符串的 Unicode 表示形式。 您可以利用for-in
来对字符串进行遍历,从而以 Unicode 可扩展的字符群集的方式访问每一个Character
值。 该过程在 使用字符 中进行了描述。
另外,能够以其他三种 Unicode 兼容的方式访问字符串的值:
- UTF-8 代码单元集合 (利用字符串的
utf8
属性进行访问) - UTF-16 代码单元集合 (利用字符串的
utf16
属性进行访问) - 21位的 Unicode 标量值集合,也就是字符串的 UTF-32 编码格式 (利用字符串的
unicodeScalars
属性进行访问)
下面由D
,o
,g
,‼
(DOUBLE EXCLAMATION MARK
, Unicode 标量 U+203C
)和狗(DOG FACE
,Unicode 标量为U+1F436
)组成的字符串中的每一个字符代表着一种不同的表示:
let dogString = "Dog‼狗"
UTF-8 表示
您可以通过遍历String
的utf8
属性来访问它的UTF-8
表示。 其为String.UTF8View
类型的属性,UTF8View
是无符号8位 (UInt8
) 值的集合,每一个UInt8
值都是一个字符的 UTF-8 表示:
Character | D U+0044 | o U+006F | g U+0067 | ‼ U+203C | 狗 U+1F436 | |||||
UTF-8 Code Unit | 68 | 111 | 103 | 226 | 128 | 188 | 240 | 159 | 144 | 182 |
Position | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
for codeUnit in dogString.utf8 {
print("\(codeUnit) ", terminator: "")
}
print("")
// 68 111 103 226 128 188 240 159 144 182
上面的例子中,前三个10进制codeUnit
值 (68
, 111
, 103
) 代表了字符D
、o
和 g
,它们的 UTF-8 表示与 ASCII 表示相同。 接下来的三个10进制codeUnit
值 (226
, 128
, 188
) 是DOUBLE EXCLAMATION MARK
的3字节 UTF-8 表示。 最后的四个codeUnit
值 (240
, 159
, 144
, 182
) 是DOG FACE
的4字节 UTF-8 表示。
UTF-16 表示
您可以通过遍历String
的utf16
属性来访问它的UTF-16
表示。 其为String.UTF16View
类型的属性,UTF16View
是无符号16位 (UInt16
) 值的集合,每一个UInt16
都是一个字符的 UTF-16 表示:
Character | D U+0044 | o U+006F | g U+0067 | ‼ U+203C | 狗 U+1F436 | |
UTF-16 Code Unit | 68 | 111 | 103 | 8252 | 55357 | 56374 |
Position | 0 | 1 | 2 | 3 | 4 | 5 |
for codeUnit in dogString.utf16 {
print("\(codeUnit) ", terminator: "")
}
print("")
// 68 111 103 8252 55357 56374
同样,前三个codeUnit
值 (68
, 111
, 103
) 代表了字符D
、o
和g
,它们的 UTF-16 代码单元和 UTF-8 完全相同(因为这些 Unicode 标量表示 ASCII 字符)。
第四个codeUnit
值 (8252
) 是一个等于十六进制203C
的的十进制值。这个代表了DOUBLE EXCLAMATION MARK
字符的 Unicode 标量值U+203C
。这个字符在 UTF-16 中可以用一个代码单元表示。
第五和第六个codeUnit
值 (55357
和56374
) 是DOG FACE
字符的 UTF-16 表示。 第一个值为U+D83D
(十进制值为55357
),第二个值为U+DC36
(十进制值为56374
)。
Unicode 标量表示
您可以通过遍历String
值的unicodeScalars
属性来访问它的 Unicode 标量表示。 其为UnicodeScalarView
类型的属性,UnicodeScalarView
是UnicodeScalar
类型的值的集合。UnicodeScalar
是21位的 Unicode 代码点。
每一个UnicodeScalar
拥有一个value
属性,可以返回对应的21位数值,用UInt32
来表示:
Character | D U+0044 | o U+006F | g U+0067 | ‼ U+203C | 狗 U+1F436 |
Unicode Scalar Code Unit | 68 | 111 | 103 | 8252 | 128054 |
Position | 0 | 1 | 2 | 3 | 4 |
for scalar in dogString.unicodeScalars {
print("\(scalar.value) ", terminator: "")
}
print("")
// 68 111 103 8252 128054
前三个UnicodeScalar
值(68
, 111
, 103
)的value
属性仍然代表字符D
、o
和g
。 第四个codeUnit
值(8252
)仍然是一个等于十六进制203C
的十进制值。这个代表了DOUBLE EXCLAMATION MARK
字符的 Unicode 标量U+203C
。
第五个UnicodeScalar
值的value
属性,128054
,是一个十六进制1F436
的十进制表示。其等同于DOG FACE
的 Unicode 标量U+1F436
。
作为查询它们的value
属性的一种替代方法,每个UnicodeScalar
值也可以用来构建一个新的String
值,比如在字符串插值中使用:
for scalar in dogString.unicodeScalars {
print("\(scalar) ")
}
// D
// o
// g
// ‼
// 狗