为什么当我使用 nativescript 从 iOS 发送表情符号字符时,我会得到陌生的字符串

Why i get stranger string when i send emoji character from iOS with nativescript

我在服务器端使用 Nativescript + Vuejs 和 Nodejs + MongoDB 开发应用程序,当我从 iOS (12.1.4) 向 Nodejs 服务器发送表情符号时遇到问题。

例如,当我发送表情符号 SMILING FACE WITH HEART-SHAPED EYES () 时,我希望该字符串看起来像 😍 可以转换为表情符号并且存储在 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

请给我一些解决方案,或者告诉我我的错误。

谢谢。

你的编码代码可以简化为

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

请注意,它将所有非 ASCII 字符编码为 \uNNNN,而不仅仅是表情符号。解码是通过反转转换来完成的:

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

这个 returns 是可选的,因为它可能因无效输入而失败。

示例:

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

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

您可能想要选择更好的函数名称,我希望它能奏效。