【问题标题】:Text with emoji is not decoding - iOS Swift带有表情符号的文本未解码 - iOS Swift
【发布时间】:2020-07-10 21:59:53
【问题描述】:

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

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"

这是原始文本图像:

【问题讨论】:

  • 这能回答你的问题吗? Swift Encode/decode emojis
  • 不,我已经检查了这篇文章,但没有找到解决方案。
  • 那么您能解释一下“未解码的编码字符串”是什么意思吗?你什么都没有看到,还是你看到垃圾?
  • 解码文本后得到的只是相同的字符串。
  • 请在您的问题中添加更多代码作为minimal reproducible example 您如何调用解码函数。

标签: ios swift decode encode emoji


【解决方案1】:

您使用的字符串无效(“我也爱...\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 解码器可以将这些类型的字符解码为表情符号 可能有无效 JSON 的机会

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

用法:

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

【讨论】:

    猜你喜欢
    • 2017-10-28
    • 2023-03-04
    • 1970-01-01
    • 2019-04-03
    • 2020-03-15
    • 2017-12-09
    • 2015-10-30
    • 2017-12-12
    • 2021-10-11
    相关资源
    最近更新 更多