ios - 带有表情符号的文本未解码 - 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"
解决方案
您使用的字符串无效(“我也爱...\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)")
推荐阅读
- node.js - 更改 dump.pm2 设置
- javascript - ReactJS 在 Docker 容器上停留在“正在启动开发服务器...”
- haskell - where 块中的 if 语法
- c# - 在 4 位日期字符串中交换月份和年份
- php - Laravel 如何在仪表板视图中为 Auth() 用户下载文件
- r - gtsummary 回归表的跨越标题
- flutter - 如何减少来自 BottomNavigationBar 的填充?
- java - JAVA-AWS Cognito -检查用户是否存在于 Cognito 用户池中
- r - 使用来自 R 中不同数据帧的过滤信息从数据帧中的列中随机抽样
- javascript - 节点 - 猫鼬更新方法问题