Текст с эмодзи не декодируется - iOS Swift - PullRequest
0 голосов
/ 30 марта 2020

Я использовал следующий код для кодирования / декодирования строки с эмодзи.

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 Go для велосипедных прогулок \ uD83D \ uDEB5 \ uD83C \ uDFFD \ u200D \ u2640 \ uFE0F \ n2 1016 * для долгих прогулок \ uD83D \ uDFFD \ u2640 \ uFE0F \ n \ u2705 Готовить \ uD83D \ uD69C \ uDFFD \ uD83C \ uDF73 \ n2 uDDFA \ uD83C \ uDDEE \ uD83C \ uDDF3 \ uD83C \ uDDEC \ uD83C \ uDDE7 \ п \ u2705 Ешь \ uD83C \ uDF2E \ uD83C \ uDF5F \ uD83C \ uDF73 \ п \ u2705 играть в настольные игры \ u265F \ п \ u2705 Go в театр \ uD83C \ uDFAD \ nМое любимое время года - осень \ uD83C \ uDF42, я люблю фильмы о супергероях \ uD83E \ u2642 \ uFE0F, а Рождество - самое замечательное время года! \ uD83C \ uDF84 "

Вот исходное текстовое изображение: Text with Emoji

1 Ответ

1 голос
/ 31 марта 2020

Неверная строка, которую вы используете \ n \ u2705")

Это должен быть действительный строковый литерал " \\ uD83D \\ uDCDA \\ u2705 "

У вас есть строка -BMP символы в виде JSON String. И ваш 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)")
...