首页 > 解决方案 > 带有表情符号的文本未解码 - iOS Swift

问题描述

我使用以下代码对具有表情符号的字符串进行编码/解码。

extension String {
    func encodeEmoji() -> String {
        let data = self.data(using: .nonLossyASCII, allowLossyConversion: true)!
        return String(data: data, encoding: .utf8)!
    }

    func decodeEmoji() -> String? {
        let data = self.data(using: .utf8)!
        return String(data: data, encoding: .nonLossyASCII)
    }
}

我在下面这样调用了这个函数。转换了“用户”模型中的响应。

let user = User() // Loaded API's response in this model
let textWithEmoji = user.aboutMe.decodeEmoji() //Here, I am getting the string as the same as before decoding
lblAboutMe.text = textWithEmoji

以下是未解码的编码字符串:

"我也爱...\n\u2705 笑\uD83D\uDE02\n\u2705 看小说\uD83D\uDCDA\n\u2705 看电影\uD83C\uDFAC\n\u2705 骑自行车\uD83D\uDEB5\uD83C \uDFFD\u200D\u2640\uFE0F\n\u2705 去长途散步 \uD83D\uDEB6\uD83C\uDFFD\u200D\u2640\uFE0F\n\u2705 厨师 \uD83D\uDC69\uD83C\uDFFD\u200D\uD83C\uDF73\ n\u2705 旅行 \uD83C\uDDEA\uD83C\uDDFA\uD83C\uDDEE\uD83C\uDDF3\uD83C\uDDEC\uD83C\uDDE7\n\u2705 吃 \uD83C\uDF2E\uD83C\uDF5F\uD83C\uDF73\n\u2705 玩棋盘游戏\u265F\n\u2705 去剧院\uD83C\uDFAD\n我最喜欢的季节是秋天\uD83C\uDF42,我喜欢超级英雄电影\uD83E\uDDB8\u200D\u2642\uFE0F,圣诞节是最美好的时光年!\uD83C\uDF84"

这是原始文本图像: 带有表情符号的文本

标签: iosswiftdecodeencodeemoji

解决方案


您使用的字符串无效(“我也爱...\n\u2705 笑\uD83D\uDE02\n\u2705 看小说\uD83D\uDCDA\n\u2705 看电影\uD83C\uDFAC\n\u2705 ”)

它应该是有效的字符串文字 “\\uD83D\\uDCDA\\u2705”

您有一个 JSON 字符串形式的字符串非 BMP 字符。而且您的 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
    }
}

之后,您需要使用以下函数从上面的字符串解码表情符号。

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
    }
}

通常 JSON 解码器可以将这些类型的字符解码为 emoji 可能存在无效 JSON 的机会

在使用之前首先需要验证这些json是否有效。

用法:

let jsonDecodedString = "Your string".jsonStringRedecoded
let decodedEmojiText = jsonDecodedString?.decodeEmoji
debugPrint("\(decodedEmojiText)")

推荐阅读