为什么我从iOS发送带有本机脚本的表情符号字符时会得到陌生的字符串

时间:2019-02-12 04:10:00

标签: ios node.js nativescript emoji vue-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

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

谢谢。

1 个答案:

答案 0 :(得分:1)

您的编码代码可以简化为

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

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

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 .
}

您可能希望选择更好的函数名称,我希望这项工作可以实现。