带有表情符号的文本未解码-iOS Swift

问题描述 投票:0回答:1

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

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 \ uDF73 \ n \ u2705旅行\ uD83C \ uDDEA \ uD83C \ uDDFA \ uD83C \ uDDEE \ uD83C \ uDDF3 \ uD83C \ uDDEC \ uD83C \ uDDE7 \ n \ u2705 Eat \ uD83C \ uDF2E \ uD83C \ uDF5F \ uD u2705玩棋盘游戏\ u265F \ n \ u2705去剧院\ uD83C \ uDFAD \ n我最喜欢的季节是秋天\ uD83C \ uDF42,我喜欢超级英雄电影\ uD83E \ uDDB8 \ u200D \ u2642 \ uFE0F,圣诞节是最美好的时光\ uD83C \ uDF84“

以下为原始文字图片:Text with Emoji

ios swift decode encode emoji
1个回答
0
投票

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

应使用有效的字符串文字“ \\ uD83D \\ uDCDA \\ u2705”

您具有以JSON字符串形式的字符串非BMP字符。而且您的encodeEmoji无法将它们转换为有效字符。

因此,我们需要强制转换此类字符串。

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解码器可以将这些类型的字符解码为表情符号可能有无效的JSON

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

用法:

let jsonDecodedString = "Your string".jsonStringRedecoded
let decodedEmojiText = jsonDecodedString?.decodeEmoji
debugPrint("\(decodedEmojiText)")
© www.soinside.com 2019 - 2024. All rights reserved.