如何将字符串 "U+XXXXXX" 中的 unicode 值转换为 Swift 中的相应字符?

How can I convert unicode values in a string "U+XXXXXX" to the corresponding characters in Swift?

我从后端接受以下 json

 {
        "id": "f33919f6-3554-4246-9e78-bca3a690c119",
        "title": "Category3",
        "slug": "category3",
        "hex_up": "#eb4034",
        "hex_down": "#80302a",
        "emoji": "U+1F602",
        "parent_id": "aa3f651b-f068-4ae1-a9d8-a18a9945b111"
    }

有个字段"emoji": "U+1F602",

我需要像在 UILabel 中一样显示表情符号图标 我尝试 google 并找到类似

的结果
let scalarValue = UnicodeScalar(emojiString)
let myString = String(scalarValue!)

不幸的是,应用程序在第二行崩溃了。 感谢您的回答。

Swift 中没有 U+... 语法。 (有一个 \u{...} 语法可以做同样的事情,但这里没有必要。)

您需要自己解析字符串:

func parseUnicode(_ string: String) -> String? {
    guard string.hasPrefix("U+"), // Make sure it's a U+ string
          let value = Int(string.dropFirst(2), radix: 16), // Convert to Int
          let scalar = UnicodeScalar(value) // Convert to UnicodeScalar
          else { return nil }

    return String(scalar) // Convert to String
}

if let myString = parseUnicode(emoji) { ... }

这里不要使用!U+... 字符串可能无效,在这种情况下您不希望崩溃。

您的应用程序崩溃的原因是您尝试初始化的 scalarValue 是 nil,并且您在第 2 行使用 (!) 的 nil 值强制展开. Rob 的回答展示了如何安全地解包可选的。

您可以使用U+后面的值获取表情符号。所以你需要删除字符串的前两个字符。所以使用这段代码来完成:

let parsedEmoji = emojiString.substring(from:2)

现在您将使用以下代码转换该表情符号 unicode。

let emoji = String(UnicodeScalar(Int(parsedEmojiHex,radix: 16)!)!)

print(emoji)

您可以简单地应用从 "Hex/Unicode""Any"(一组所有字符)的字符串转换:

"U+1F602".applyingTransform(.init("Hex/Unicode-Any"), reverse: false)   // ""

或作为 StringProtocol 的实例属性到 encode/decode from/to hexa unicode:


extension StringTransform {
    static let unicodeToAny: Self = .init("Hex/Unicode-Any")
    static let anyToUnicode: Self = .init("Any-Hex/Unicode")
}

extension StringProtocol {
    var decodingHexaUnicode: String {
        applyingTransform(.unicodeToAny, reverse: false)!
    }
    var encodingHexaUnicode: String {
        applyingTransform(.anyToUnicode, reverse: false)!
    }
}

用法:

let hexaUnicode = "U+1F602"
let emoji = hexaUnicode.decodingHexaUnicode       // ""
let unicodeFromEmoji = emoji.encodingHexaUnicode  // "U+1F602"