表情符号没有在Swift中显示

时间:2017-10-27 06:26:03

标签: ios emoji swift4 iphone7plus

我试图展示来自JSON响应的表情符号。当我们在下面的字符串中没有0️⃣1️⃣3️⃣5️⃣并且不能使用下面的字符串时它工作正常。

var titleLabelString = \ud83d\ude0a\ud83d\ude18\u2626\ufe0f 0️⃣1️⃣3️⃣5️⃣ 

我正在使用的功能:

extension String {
    var decodeEmoji: String? {
      let data = self.data(using: String.Encoding.utf8,allowLossyConversion: false);
      let decodedStr = NSString(data: data!, encoding: String.Encoding.nonLossyASCII.rawValue)
      if decodedStr != nil{
        return decodedStr as String?
    }
      return self
}
}

使用它像:

titleLabelString = titleLabelString.decodeEmoji!

这有什么问题?

1 个答案:

答案 0 :(得分:2)

您在评论中显示的代码点:

U+005C U+0075 U+0064 U+0038 U+0033 U+0064 U+005C U+0075 U+0064 U+0065 U+0030 U+0061 U+005C U+0075 U+0064 U+0038 U+0033 U+0064 U+005C U+0075 U+0064 U+0065 U+0031 U+0038 U+005C U+0075 U+0064 U+0038 U+0033 U+0064 U+005C U+0075 U+0064 U+0065 U+0030 U+0032 U+0035 U+FE0F U+20E3 U+0033 U+FE0F U+20E3 U+0031 U+FE0F U+20E3 U+0030 U+FE0F U+20E3

代表一个这样的字符串:

\ ud83d \ ude0a \ ud83d \ ude18 \ ud83d \ude025️⃣3️⃣1️⃣0️⃣

(似乎你选择了另一个字符串而不是你的问题。)

作为Swift中的有效字符串文字,它变为:

"\\ud83d\\ude0a\\ud83d\\ude18\\ud83d\\ude02\u{0035}\u{FE0F}\u{20E3}\u{0033}\u{FE0F}\u{20E3}\u{0031}\u{FE0F}\u{20E3}\u{0030}\u{FE0F}\u{20E3}"

无论如何,你有一个字符串,其中非BMP字符用JSON字符串表示,如转义序列。而您的decodeEmoji无法将其转换为有效字符。

您可以强制转换此类字符串:

extension String {
    var jsonStringRedecoded: String? {
        let data = ("\""+self+"\"").data(using: .utf8)!
        let result = try! JSONSerialization.jsonObject(with: data, options: .allowFragments) as! String
        return result
    }
}

(如果您的字符串可能包含更多元字符,则可能需要修改此代码。)

var titleLabelString = "\\ud83d\\ude0a\\ud83d\\ude18\\ud83d\\ude02\u{0035}\u{FE0F}\u{20E3}\u{0033}\u{FE0F}\u{20E3}\u{0031}\u{FE0F}\u{20E3}\u{0030}\u{FE0F}\u{20E3}"

print(titleLabelString.jsonStringRedecoded) //->5️⃣3️⃣1️⃣0️⃣

但通常,通常的JSON解码器可以解码非BMP字符(包括表情符号)。所以,如果你从JSON响应获得这种字符串

  • 您的服务器可能正在发送无效的JSON响应

  • 您可能正在使用损坏的JSON解码器

在使用强制重新解码之前,最好先检查一下这些内容。