簡體   English   中英

表情符號未在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 \?5️⃣3️⃣1️⃣0️⃣

(似乎您選擇的不是問題中的其他字符串。)

作為Swift中的有效String文字,它變為:

"\\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響應中得到這種字符串,

  • 您的服務器可能正在發送無效的JSON響應

要么

  • 您可能正在使用損壞的JSON解碼器

在使用強制重新解碼之前,您最好檢查一下這些內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM