? ? 當(dāng)把一個Unicode字符串寫入文本文件或者以其他形式存儲绎巨,字符串中的Unicode標量會被編碼成Unicode定義的幾種編碼形式中的一種。每一種字符串編碼形式都把字符串編碼成更小塊的編碼單元蚕泽。其中有:
? ??????UTF-8編碼:把一個字符串以8位的一個編碼單元進行編碼
? ??????UTF-16編碼:把一個字符串以16位的一個編碼單元進行編碼
? ??????UTF-32編碼:把一個字符串以32位的一個編碼單元進行編碼
? ? Swift提供了幾種不同的方式去訪問字符串的Unicode表示惋啃。我們可以使用for-in語句遍歷字符串,然后去訪問每一個字符的Unicode字形集规辱。
? ? 當(dāng)然,我們也可以使用洗面3中Unicode兼容的方式去訪問字符串的值:
? ? ? ? 一個UTF-8編碼單元的集合栽燕,通過屬性 utf8 獲取
????????一個UTF-16編碼單元的集合,通過屬性?utf16?獲取????
????????一個21位的Unicode標量值組成的集合改淑,和UTF-32編碼形式相等碍岔,通過屬性?unicodeScalars獲取
? ? 下面的每一個例子展示了下方字符串的不同的表示,一個由字符D朵夏,o蔼啦,g,Q霾捏肢!和??組成的字符串奈籽。
? ??????let dogString = "Dog???"
UTF-8表示
? ? 可以通過遍歷屬性uft8獲得字符串的UTF-8的表示。這個屬性是一個String.UTF8View類型的值鸵赫,是一組8位無符號數(shù)字的集合衣屏。下圖說明了每一個無符號數(shù)字和字符串UTF-8表示的對應(yīng)關(guān)系:
? ??????????????for codeUnit in dogString.utf8 {
????????????????? ? print("\(codeUnit) ", terminator: "")
? ? ? ?????????}
????????????????// 打印 "68 111 103 226 128 188 240 159 144 182 ”
????上面的例子中,開始三個數(shù)字編碼單元(68, 111, 103)代表了字符D辩棒,o狼忱,g,這里的UTF-8表示和ASCII表示是一樣的一睁。接下來的三個數(shù)字編碼單元(226, 128, 188)是一個3字節(jié)的UTF-8表示钻弄,代表了DOUBLE EXCLAMATION MARK(!!)字符。最后的4個編碼單元(240, 159, 144, 182)是一個4字節(jié)UTF-8表示者吁,代表了DOG FACE??字符窘俺。
UTF-16表示
? ? 可以通過遍歷屬性uft16獲得字符串的UTF-16的表示。這個屬性是一個String.UTF16View類型的值复凳,是一組16位無符號數(shù)字的集合瘤泪,下圖說明了每一個無符號數(shù)字和字符串UTF-16表示的對應(yīng)關(guān)系:
? ??????for codeUnit in dogString.utf16 {
????????? ? print("\(codeUnit) ", terminator: "")
????????}
????????// 打印 "68 111 103 8252 55357 56374 ”
????相同的,開始的三個編碼單元(68, 111, 103) 代表了字符D染坯,o均芽,g,和UTF-8中的表示相同单鹿,都等于ASCII的表示掀宋。
? ? 第四個編碼單元(8252)在數(shù)值上等于16進制的203C,表示了Unicode標量U+203C也就是字符DOUBLE EXCLAMATION MARK(!!)仲锄,這個字符在UTF-16中可以用一個代碼單元來表示劲妙。
? ? 第5個和第6個編碼單元(55357,56374)是DOG FACE??在UTF-16中的代理對的表示。這里是一個高代理點U+D83D(55357)和一個低代理點U+DC36 (56374)儒喊。
Unicode標量表示
?????可以通過遍歷屬性unicodeScalars獲得字符串的Unicode標量表示镣奋。這個屬性是一個UnicodeScalarView類型的值,是一組unicode標量的集合怀愧。
? ? 每一個Unicode標量的value屬性會返回一個21位的標量的值侨颈,表示了一個UInt32的值。
? ??????for scalar in dogString.unicodeScalars {
????????? ? print("\(scalar.value) ", terminator: "")
????????}
????????// 打印 "68 111 103 8252 128054 ”
????同樣芯义,開始三個Unicode標量(68, 111, 103)還是代表了字符D哈垢,o,g扛拨。
? ? 第4個編碼單元(8252),還是和16進制的203C相等靴迫,表示了Unicode標量U+203C也就是字符DOUBLE EXCLAMATION MARK(!!)凰萨。
? ? 第5個編碼單元(128054)在數(shù)值上等于16進制的1F436诺舔,表示了Unicode標量U+1F436,也就是字符DOG FACE(??)央渣。
? ? 和獲取Unicode編碼單元的value屬性不一樣,每一個Unicode編碼單元都可以被用來構(gòu)造一個新的字符串渴频,比如字符串插入:
? ??????for scalar in dogString.unicodeScalars {
????????? ? print("\(scalar) ")
????????}
????????// D
????????// o
????????// g
????????// ?
????????// ??