2017-07-09 65 views
1

作爲一個通用的解決方案,我們如何獲得Swift中字符或字符串的unicode代碼點/ s?如何在Swift中獲得字符/字符串的unicode代碼點表示?

考慮以下幾點:

let A: Character = "A"  // "\u{0041}" 
let Á: Character = "Á"  // "\u{0041}\u{0301}" 

let sparklingHeart = "" // "\u{1F496}" 
let SWIFT = "SWIFT"  // "\u{0053}\u{0057}\u{0049}\u{0046}\u{0054}" 

如果我沒有弄錯,所需的功能可能會返回一個字符串數組,例如:

extension Character { 
    func getUnicodeCodePoints() -> [String] { 
     //... 
    } 
} 

A.getUnicodeCodePoints() 
// the output should be: ["\u{0041}"] 

Á.getUnicodeCodePoints() 
// the output should be: ["\u{0041}", "\u{0301}"] 

sparklingHeart.getUnicodeCodePoints() 
// the output should be: ["\u{1F496}"] 

SWIFT.getUnicodeCodePoints() 
// the output should be: ["\u{0053}", "\u{0057}", "\u{0049}", "\u{0046}", "\u{0054}"] 

任何更多的建議簡潔的方法,將不勝感激。

回答

2

一般而言,StringunicodeScalars屬性將返回其unicode標量值的集合 。 (A Unicode scalar value是除高代理和低代理代碼點任何 Unicode代碼點。)

實施例:

print(Array("Á".unicodeScalars)) // ["A", "\u{0301}"] 
print(Array("".unicodeScalars)) // ["\u{0001F496}"] 

還有就是(如夫特3的)沒有辦法訪問 Unicode標直接輸入Character的值,必須首先將 轉換爲String。 (這就改變了斯威夫特4, 見SE-0178 Add unicodeScalars property to Character。)

如果你想看到所有的Unicode標量值爲十六進制數字 那麼你就可以訪問value財產(這是一個UInt32號) 並格式化根據您的需要。

例(使用U+NNNN符號的Unicode值):

extension String { 
    func getUnicodeCodePoints() -> [String] { 
     return unicodeScalars.map { "U+" + String($0.value, radix: 16, uppercase: true) } 
    } 
} 

extension Character { 
    func getUnicodeCodePoints() -> [String] { 
     return String(self).getUnicodeCodePoints() 
    } 
} 


print("A".getUnicodeCodePoints())  // ["U+41"] 
print("Á".getUnicodeCodePoints())  // ["U+41", "U+301"] 
print("".getUnicodeCodePoints()) // ["U+1F496"] 
print("SWIFT".getUnicodeCodePoints()) // ["U+53", "U+57", "U+49", "U+46", "U+54"] 
print("".getUnicodeCodePoints()) // ["U+1F1EF", "U+1F1F4"] 
+0

謝謝您的回答。請注意,我得到的print(Array(「Á」.unicodeScalars))的輸出是'[「\ u {00C1}」]',但* not *'[「A」,「\ u {0301}」 ]',類似於這種情況,我試過:'print(Array(「é」.unicodeScalars))'並且輸出是'[「\ u」}「],但不是'[」u「,」e \ ∪{0301}「]';我知道在比較時應該可以,他們應該是平等的,但我不知道這是什麼原因... –

+1

@AhmadF:那是​​因爲有一個「預先分解」和「分解」的字符組合表示,並結合了變音符號。嘗試'「Á」.precomposedStringWithCanonicalMapping.getUnicodeCodePoints()'和'「Á」.decomposedStringWithCanonicalMapping.getUnicodeCodePoints()' –

相關問題