字符串的 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 表示

您可以通过遍历Stringutf8属性来访问它的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值 (68111103) 代表了字符Do和 g,它们的 UTF-8 表示与 ASCII 表示相同。 接下来的三个10进制codeUnit值 (226128188) 是DOUBLE EXCLAMATION MARK的3字节 UTF-8 表示。 最后的四个codeUnit值 (240159144182) 是DOG FACE的4字节 UTF-8 表示。


UTF-16 表示

您可以通过遍历Stringutf16属性来访问它的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值 (68111103) 代表了字符Dog,它们的 UTF-16 代码单元和 UTF-8 完全相同(因为这些 Unicode 标量表示 ASCII 字符)。第四个codeUnit值 (8252) 是一个等于十六进制203C的的十进制值。这个代表了DOUBLE EXCLAMATION MARK字符的 Unicode 标量值U+203C。这个字符在 UTF-16 中可以用一个代码单元表示。第五和第六个codeUnit值 (5535756374) 是DOG FACE字符的 UTF-16 表示。 第一个值为U+D83D(十进制值为55357),第二个值为U+DC36(十进制值为56374)。


Unicode 标量表示

您可以通过遍历String值的unicodeScalars属性来访问它的 Unicode 标量表示。 其为UnicodeScalarView类型的属性,UnicodeScalarViewUnicodeScalar类型的值的集合。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值(68111103)的value属性仍然代表字符Dog。 第四个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
// ‼
// 狗