【问题标题】:How to get unicode code point(s) representation of character/string in Swift?如何在 Swift 中获取字符/字符串的 unicode 代码点表示?
【发布时间】:2017-07-09 09:30:33
【问题描述】:

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

如果有更多建议的优雅方法,我们将不胜感激。

【问题讨论】:

    标签: swift string unicode character codepoint


    【解决方案1】:

    通常,StringunicodeScalars 属性返回一个集合 其 unicode 标量值。 (Unicode scalar value 是任何 Unicode 代码点,除了高代理和低代理代码点。)

    例子:

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

    在 Swift 3 之前无法访问 Character 的 unicode 标量值,它必须是 首先转换为 String(有关 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 开始,CharacterunicodeScalars 可以是 直接访问, 见SE-0178 Add unicodeScalars property to Character。这使得转换为String 过时的:

    let c: Character = "??"
    print(Array(c.unicodeScalars)) // ["\u{0001F1EF}", "\u{0001F1F4}"]
    

    【讨论】:

    • 感谢您的回答。请注意我得到的print(Array("Á".unicodeScalars)) 的输出是["\u{00C1}"]不是 ["A", "\u{0301}"],类似于这种情况,我试过:print(Array("é".unicodeScalars)) 输出是["\u{00E9}"] 但不是@987654341 @;我知道比较时应该没问题,它们应该相等,但我想知道这是什么原因......
    • @AhmadF:那是​​因为有一个“预组合”和一个“分解”的字符表示,并结合了变音符号。试试"Á".precomposedStringWithCanonicalMapping.getUnicodeCodePoints()"Á".decomposedStringWithCanonicalMapping.getUnicodeCodePoints()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2010-10-15
    • 2010-11-24
    相关资源
    最近更新 更多