【问题标题】:How can I convert unicode values in a string "U+XXXXXX" to the corresponding characters in Swift?如何将字符串“U+XXXXXX”中的 unicode 值转换为 Swift 中的相应字符?
【发布时间】:2021-06-25 16:54:56
【问题描述】:

我从后端接受以下 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”,

我需要显示 emoji 图标,例如 ????在 UILabel 中 我尝试谷歌并找到类似的结果

let scalarValue = UnicodeScalar(emojiString)
let myString = String(scalarValue!)

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

【问题讨论】:

    标签: swift string unicode


    【解决方案1】:

    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+... 字符串可能无效,在这种情况下您不希望崩溃。

    【讨论】:

      【解决方案2】:

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

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

      或作为 StringProtocol 的实例属性来从/到 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"
      

      【讨论】:

      • 我同意这行得通,但是(作为一个花费大量时间阅读 Unicode 规范并且从未见过这种特殊转换的人)我认为这个答案需要解释你如何发现“Hex-Any " 是这里正确的转换。 “任何”在这里特别代表什么?这适用于所有 Unicode 用途吗?
      • 我不记得在哪里找到了这个用于将 U+XXXX 解码为字符的特定字符串转换(“U+1F602”到“?”)。我知道您可以使用"Hex/Unicode" 进行相反的字符串转换(编码),从“?”变为“U+1F602”
      • 真的,用斜线代替连字符?我宁愿自己写代码,也不愿猜测我在网上找到的神奇字符串是做什么的。
      【解决方案3】:

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

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

      let parsedEmoji = emojiString.substring(from:2)
      

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-11-04
        • 2013-07-19
        • 1970-01-01
        • 2016-04-08
        • 2016-09-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多