Swift 中未显示表情符号
Emoji not showing in Swift
我正在尝试显示来自 JSON 响应的表情符号。当我们在下面的字符串中没有 0️⃣1️⃣3️⃣5️⃣ 并且不适用于下面的字符串时,它工作正常。
var titleLabelString = \ud83d\ude0a\ud83d\ude18\u2626\ufe0f 0️⃣1️⃣3️⃣5️⃣
我正在使用的功能:
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
}
}
像这样使用它:
titleLabelString = titleLabelString.decodeEmoji!
这有什么问题吗?
您在评论中显示的代码点:
U+005C U+0075 U+0064 U+0038 U+0033 U+0064 U+005C U+0075 U+0064 U+0065 U+0030 U+0061 U+005C U+0075 U+0064 U+0038 U+0033 U+0064 U+005C U+0075 U+0064 U+0065 U+0031 U+0038 U+005C U+0075 U+0064 U+0038 U+0033 U+0064 U+005C U+0075 U+0064 U+0065 U+0030 U+0032 U+0035 U+FE0F U+20E3 U+0033 U+FE0F U+20E3 U+0031 U+FE0F U+20E3 U+0030 U+FE0F U+20E3
表示这样的字符串:
\ud83d\ude0a\ud83d\ude18\ud83d\ude025️⃣3️⃣1️⃣0️⃣
(您似乎选择了与问题中不同的字符串。)
作为 Swift 中的有效字符串文字,它变为:
"\ud83d\ude0a\ud83d\ude18\ud83d\ude02\u{0035}\u{FE0F}\u{20E3}\u{0033}\u{FE0F}\u{20E3}\u{0031}\u{FE0F}\u{20E3}\u{0030}\u{FE0F}\u{20E3}"
无论如何,你有一个字符串,其中非 BMP 字符用 JSON 字符串表示,如转义序列。而您的 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
}
}
(如果您的字符串可能包含更多元字符,您可能需要修改此代码。)
var titleLabelString = "\ud83d\ude0a\ud83d\ude18\ud83d\ude02\u{0035}\u{FE0F}\u{20E3}\u{0033}\u{FE0F}\u{20E3}\u{0031}\u{FE0F}\u{20E3}\u{0030}\u{FE0F}\u{20E3}"
print(titleLabelString.jsonStringRedecoded) //->5️⃣3️⃣1️⃣0️⃣
但通常,通常的 JSON 解码器可以解码非 BMP 字符(包括表情符号)。所以,如果你从 JSON response,
得到这种字符串
- 您的服务器可能正在发送无效的 JSON 响应
或
- 您可能使用了损坏的 JSON 解码器
在使用强制重新解码之前,您最好检查一下这些内容。
我正在尝试显示来自 JSON 响应的表情符号。当我们在下面的字符串中没有 0️⃣1️⃣3️⃣5️⃣ 并且不适用于下面的字符串时,它工作正常。
var titleLabelString = \ud83d\ude0a\ud83d\ude18\u2626\ufe0f 0️⃣1️⃣3️⃣5️⃣
我正在使用的功能:
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
}
}
像这样使用它:
titleLabelString = titleLabelString.decodeEmoji!
这有什么问题吗?
您在评论中显示的代码点:
U+005C U+0075 U+0064 U+0038 U+0033 U+0064 U+005C U+0075 U+0064 U+0065 U+0030 U+0061 U+005C U+0075 U+0064 U+0038 U+0033 U+0064 U+005C U+0075 U+0064 U+0065 U+0031 U+0038 U+005C U+0075 U+0064 U+0038 U+0033 U+0064 U+005C U+0075 U+0064 U+0065 U+0030 U+0032 U+0035 U+FE0F U+20E3 U+0033 U+FE0F U+20E3 U+0031 U+FE0F U+20E3 U+0030 U+FE0F U+20E3
表示这样的字符串:
\ud83d\ude0a\ud83d\ude18\ud83d\ude025️⃣3️⃣1️⃣0️⃣
(您似乎选择了与问题中不同的字符串。)
作为 Swift 中的有效字符串文字,它变为:
"\ud83d\ude0a\ud83d\ude18\ud83d\ude02\u{0035}\u{FE0F}\u{20E3}\u{0033}\u{FE0F}\u{20E3}\u{0031}\u{FE0F}\u{20E3}\u{0030}\u{FE0F}\u{20E3}"
无论如何,你有一个字符串,其中非 BMP 字符用 JSON 字符串表示,如转义序列。而您的 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
}
}
(如果您的字符串可能包含更多元字符,您可能需要修改此代码。)
var titleLabelString = "\ud83d\ude0a\ud83d\ude18\ud83d\ude02\u{0035}\u{FE0F}\u{20E3}\u{0033}\u{FE0F}\u{20E3}\u{0031}\u{FE0F}\u{20E3}\u{0030}\u{FE0F}\u{20E3}"
print(titleLabelString.jsonStringRedecoded) //->5️⃣3️⃣1️⃣0️⃣
但通常,通常的 JSON 解码器可以解码非 BMP 字符(包括表情符号)。所以,如果你从 JSON response,
得到这种字符串- 您的服务器可能正在发送无效的 JSON 响应
或
- 您可能使用了损坏的 JSON 解码器
在使用强制重新解码之前,您最好检查一下这些内容。