Swift Unicode
Unicode
Unicode 是一個國際標準,用於文本的編碼和表示。 它使您可以用標準格式表示來自任意語言幾乎所有的字符,並能夠對文本文件或網頁這樣的外部資源中的字符進行讀寫操作。
Swift 的字符串和字符類型是完全兼容 Unicode 標準的,它支持如下所述的一系列不同的 Unicode 編碼。
Unicode 術語(Unicode Terminology)
Unicode 中每一個字符都可以被解釋爲一個或多個 unicode 標量。 字符的 unicode 標量是一個唯一的21位數字(和名稱),例如U+0061
表示小寫的拉丁字母A ("a"),U+1F425
表示小雞表情 ("?")
當 Unicode 字符串被寫進文本文件或其他存儲結構當中,這些 unicode 標量將會按照 Unicode 定義的集中格式之一進行編碼。其包括UTF-8
(以8位代碼單元進行編碼) 和UTF-16
(以16位代碼單元進行編碼)。
字符串的 Unicode 表示(Unicode Representations of Strings)
Swift 提供了幾種不同的方式來訪問字符串的 Unicode 表示。
您可以利用for-in
來對字符串進行遍歷,從而以 Unicode 字符的方式訪問每一個字符值。 該過程在 使用字符 中進行了描述。
另外,能夠以其他三種 Unicode 兼容的方式訪問字符串的值:
- UTF-8 代碼單元集合 (利用字符串的
utf8
屬性進行訪問) - UTF-16 代碼單元集合 (利用字符串的
utf16
屬性進行訪問) - 21位的 Unicode 標量值集合 (利用字符串的
unicodeScalars
屬性進行訪問)
下面由D``o``g``!
和?
(DOG FACE
,Unicode 標量爲U+1F436
)組成的字符串中的每一個字符代表着一種不同的表示:
let dogString = "Dog!?"
UTF-8
您可以通過遍歷字符串的utf8
屬性來訪問它的UTF-8
表示。 其爲UTF8View
類型的屬性,UTF8View
是無符號8位 (UInt8
) 值的集合,每一個UInt8
值都是一個字符的 UTF-8 表示:
for codeUnit in dogString.utf8 {
print("\(codeUnit) ")
}
print("\n")
// 68 111 103 33 240 159 144 182
上面的例子中,前四個10進制代碼單元值 (68, 111, 103, 33) 代表了字符D
o
g
和!
,它們的 UTF-8 表示與 ASCII 表示相同。 後四個代碼單元值 (240, 159, 144, 182) 是DOG FACE
的4字節 UTF-8 表示。
UTF-16
您可以通過遍歷字符串的utf16
屬性來訪問它的UTF-16
表示。 其爲UTF16View
類型的屬性,UTF16View
是無符號16位 (UInt16
) 值的集合,每一個UInt16
都是一個字符的 UTF-16 表示:
for codeUnit in dogString.utf16 {
print("\(codeUnit) ")
}
print("\n")
// 68 111 103 33 55357 56374
同樣,前四個代碼單元值 (68, 111, 103, 33) 代表了字符D
o
g
和!
,它們的 UTF-16 代碼單元和 UTF-8 完全相同。
第五和第六個代碼單元值 (55357 和 56374) 是DOG FACE
字符的UTF-16 表示。 第一個值爲U+D83D
(十進制值爲 55357),第二個值爲U+DC36
(十進制值爲 56374)。
Unicode 標量 (Unicode Scalars)
您可以通過遍歷字符串的unicodeScalars
屬性來訪問它的 Unicode 標量表示。 其爲UnicodeScalarView
類型的屬性,UnicodeScalarView
是UnicodeScalar
的集合。 UnicodeScalar
是21位的 Unicode 代碼點。
每一個UnicodeScalar
擁有一個值屬性,可以返回對應的21位數值,用UInt32
來表示。
for scalar in dogString.unicodeScalars {
print("\(scalar.value) ")
}
print("\n")
// 68 111 103 33 128054
同樣,前四個代碼單元值 (68, 111, 103, 33) 代表了字符D
o
g
和!
。 第五位數值,128054,是一個十六進制1F436的十進制表示。 其等同於DOG FACE
的Unicode 標量 U+1F436。
作爲查詢字符值屬性的一種替代方法,每個UnicodeScalar
值也可以用來構建一個新的字符串值,比如在字符串插值中使用:
for scalar in dogString.unicodeScalars {
println("\(scalar) ")
}
// D
// o
// g
// !
// ?