我已经使用以下代码对具有表情符号的字符串进行编码/解码。
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“
您使用的字符串无效(“ 我也爱... \ 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)")