Почему я получаю странную строку при отправке символа эмодзи из iOS с помощью nativescript

Я работаю с приложением с Nativescript + Vuejs и Nodejs + MongoDB на стороне сервера, и у меня возникают проблемы, когда я отправляю символы эмодзи со своего iOS (12.1.4) на сервер Nodejs.

Например, когда я отправляю смайлик УЛЫБАЮЩЕЕ ЛИЦО С ГЛАЗАМИ В ФОРМЕ СЕРДЦА (????), я надеюсь, что эта строка выглядит как & # x1f60d, потому что можно преобразовать в смайлик и сохранить в MongoDB.

Но получите эту строку: \ M-p \ M ^ _ \ M ^ X \ M ^ M

Самым странным в этом случае является то, что это происходит только тогда, когда я отправляю с моего устройства iOS 6.

С эмулятором iOS 8 действие отправки эмодзи работает нормально.

Итак, я действительно не знаю, в чем причина этой проблемы, может быть, мое устройство, конфигурация клавиатуры или UTF ...

Список некоторых строк эмодзи, которые я получаю:

????: \M-p\M^_\M^X\M^@

????: \M-p\M^_\M^X\M^C

????: \M-p\M^_\M^X\M^N

????: \M-p\M^_\M^T\M-%

????: \M-p\M^_\M^X\M-!

Некоторая документация:

http://www.grumdrig.com/emoji-list/

https://apps.timwhitlock.info/emoji/tables/unicode

Пожалуйста, дайте мне какое-нибудь решение или скажите, в чем моя ошибка.

Спасибо.


person dcandamil    schedule 12.02.2019    source источник


Ответы (1)


Ваш код кодировки можно упростить до

extension String {
    func encode(_ s: String) -> String {
        let data = s.data(using: .nonLossyASCII, allowLossyConversion: true)!
        return String(data: data, encoding: .utf8)!
    }
}

Обратите внимание, что он кодирует все символы, отличные от ASCII, как \ uNNNN, а не только Emojis. Декодирование выполняется путем обращения преобразований:

extension String {
    func decode(_ s: String) -> String? {
        let data = s.data(using: .utf8)!
        return String(data: data, encoding: .nonLossyASCII)
    }
}

Это возвращает необязательный параметр, потому что он может завершиться ошибкой из-за недопустимого ввода.

Пример:

let s = "Hello ????."
let e = encode(s)
print(e) // Hello \ud83d\ude03.

if let d = decode(e) {
    print(d) // Hello ????.
}

Возможно, вы захотите выбрать лучшие имена функций, и я надеюсь, что это сработает.

person Pradip Patel    schedule 12.02.2019
comment
Спасибо, вы дали мне свет, окончательным решением было encodeURI (строка) при отправке и decodeURI (строка) при переходе в хранилище в MongoDB - person dcandamil; 12.02.2019