標籤:des style 使用 檔案 for io
Unicode (Unicode碼)
Unicode是一種國際標準的文本編碼.它的標準表中幾乎包含所有語言的任一字元,並且可以通過擴充檔案或者網頁讀寫這些字元.
在Swift中,String(字串)類型和Character(字元)類型完全相容Unicode,而且它們也支援非Unicode碼.
Unicode Terminology (Unicode 術語)
每個Unicode碼都可以用一個或者多個Unicode標量表示.對於一個字元來說,一個Unicode標量都是一個唯一的21位的值(或名稱),例如“ U+0061 表示 LOWERCASE LATIN LETTER A ("a"),或者U+1F425 表示 FRONT-FACING BABY CHICK ("??").
當一個Unicode字串以文字檔或其他方式儲存的時候,它們的Unicode標量也會以按照Unicode定義的格式進行編碼.每種格式都使用叫做編碼單元(code unit)的塊來編碼字串. 這些格式裡包括UTF-8格式(使用八位編碼單元編碼一個字串)和UTF-16格式(使用十六位編碼單元編碼一個字串)
Unicode Representations of Strings (字串的Unicode表示)
在Swift中,提供了幾種不同的存取Unicode形式的字串.
你可以使用for-in語句來遍曆字串,來存取每個Unicode字元的字元值.
或者也可以用下面的三種方式中的一個來存取Unicode字串類型的值.
- UTF-8 code units (使用字串的 utf8 屬性存取)
- UTF-16 code units (使用字串的 utf16 屬性存取)
- UTF-21 code units (使用字串的 unicodeScalars 屬性存取)
下面的每個例子示範了字串”Dog!??”的不同表示方式:
let dogString = "Dog!??"
UTF-8
使用utf8的屬性可以按照UTF-8的形式來訪問字串.utf8屬性的類型是UTF8View,它是一組無符號的8位元值(UInt8),每個值代表UTF-8的一個位元組.
for codeUnit in dogString.utf8 {
print("\(codeUnit) ")
}
print("\n")
// 68 111 103 33 240 159 144 182
在這個例子中,codeUnit的前四個十進位的值(68 111 103 33)分別表示字元D,o,g和!.這與ASCII是一樣的.codeUnit的後四個值(240 159 144 182)代表字元DOG FACE的UTF-8 四位元組形式.
UTF-16
使用字串的utf16屬性,可以按照UTF16方式存取字串. utf16屬性的類型是UTF16View,它是一組無符號16位元值(UInt16),一個值代表UTF16中的一個16位編碼單元:
for codeUnit in dogString.utf16 {
print("\(codeUnit) ")
}
print("\n")
// 68 111 103 33 55357 5637
同樣的,codeUnit的前四個值(68 111 103 33)表示字元D,o,g和!.這些和UTF-8是相同的.
codeUnit的第十五和第十六個值是DOG FACE 的UTF-16替代表示:U+D83D(十進位值為55357)和U+DC36(十進位值為56374).
Unicode Scalars (Unicode 標量)
通過unicodeScalars屬性也可以訪問存取字串,這個屬性的類型是UnicodeScalarView.
每個 UnicodeScalar 都有一個value屬性,它是一個UInt32的值,
for scalar in dogString.unicodeScalars {
print("\(scalar.value) ")
}
print("\n")
// 68 111 103 33 128054
UnicodeScalar的value屬性的前四個值(68 111 103 33)與前面的兩個例子相同,都是表示字元D,o,g和!,最後的值128054(十進位)是十六進位的1F436,表示 DOG FACE.
通過value屬性,每個UnicodeScalar的值也可以用來構建一個新的字串:
for scalar in dogString.unicodeScalars {
println("\(scalar) ")
}
// D
// o
// g
// !
// ??”