作为一个通用的解决方案,如何在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}"]

如果您能提出更优雅的方法,我们将不胜感激。

最佳答案

通常,unicodeScalarsString属性返回一个集合
它的Unicode标量值。(aUnicode scalar value是任何
除高代理项和低代理项代码点之外的Unicode代码点。)
例子:

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

至SWIFT 3无法进入
aCharacter的unicode标量值必须是
首先转换为aString(有关swift 4状态,请参见下文)。
如果希望将所有Unicode标量值都视为十六进制数
然后您可以访问value属性(它是一个UInt32数字)
并根据您的需要进行格式化。
示例(对Unicode值使用U+NNNN符号):
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"]

SWIFT 4的更新:
从swift 4开始,aunicodeScalarsCharacter可以是
直接访问,
SE-0178 Add unicodeScalars property to Character。这使得转换为String
过时的:
let c: Character = "🇯🇴"
print(Array(c.unicodeScalars)) // ["\u{0001F1EF}", "\u{0001F1F4}"]

关于swift - 如何在Swift中获取字符/字符串的Unicode代码点表示形式?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44994928/

10-11 22:07
查看更多