字符串的 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
// ‼
// 狗