如何在Swift中获取字符/字符串的unicode代码点表示?

时间:2017-07-09 09:30:33

标签: swift string unicode character codepoint

作为一般解决方案,我们如何在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}"]

任何建议的优雅方法都将受到赞赏。

1 个答案:

答案 0 :(得分:2)

通常,unicodeScalars的{​​{1}}属性会返回一个集合 它的unicode标量值。 (A Unicode scalar value是任意的 除高代理和低代理代码点之外的Unicode代码点。)

示例:

String

直到Swift 3无法访问 一个print(Array("Á".unicodeScalars)) // ["A", "\u{0301}"] print(Array("".unicodeScalars)) // ["\u{0001F496}"] 的unicode标量值直接,它必须是 首先转换为Character(对于Swift 4状态,请参见下文)。

如果要将所有Unicode标量值视为十六进制数 然后你可以访问String属性(value个号码) 并根据您的需要进行格式化。

示例(对Unicode值使用UInt32表示法):

U+NNNN

Swift 4的更新:

从Swift 4开始,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"] 的{​​{1}}就可以了 直接访问, 见SE-0178 Add unicodeScalars property to Character。这样就可以转换为unicodeScalars 过时的:

Character