位置:首頁 > 高級語言 > Swift教學 > Swift Unicode

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類型的屬性,UnicodeScalarViewUnicodeScalar的集合。 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
// !
// ?