Swift_Unicode

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章