表情符号在使用 swift(iOS)、java(android)、ruby(服务器)、mongodb 制作的应用中显示为问号(数据库)

Emojis showing up as question marks in app made using swift(iOS), java(android), ruby(server), mongodb(database)

我一直在开发这个用户可以发送表情符号的聊天应用程序。现在我从任何用户在 UITextField 中输入的字符串中获取字符串并将其放入 NSDictionary 并将其作为 json 发送到服务器。然后 json 被发送到服务器,消息在 ruby 中被读取为字符串,然后存储在 mongodb 中。现在,当另一个客户端进行获取消息 api 调用时,表情符号显示为一个框或一个“?”。 P.S :仅显示具有 5 个字符代码的表情符号,例如:\u1F602 但是带有 4 个字符代码的表情符号显示正常,例如:\u2764

现在我不知道问题是客户端还是服务器还是数据库,所以我不知道要在这里添加哪个代码。请在评论中添加您需要的代码,我会在此处 post。

感觉是服务器的问题,因为android和iOS设备都有问题。

我已经为此苦思了一个多月了。如果有人可以提供帮助,我会很高兴。

谢谢

----编辑----

我知道在 ruby \u{1F602} 中有效,但我不知道如何让客户以那种格式发送它。我只是在 UITextField(对于 iOS)和 EditText(对于 Android)中使用任何用户类型并按原样发送它们。 有什么方法可以在客户端进行更改或以某种方式在服务器上修复它?

没有大括号的简化表示法假定 \u 后面有四位数字。对于 3 字节,应该使用完整的表达式:

▶ "\u{1F602}"
#⇒ ""

在iOS,

要将表情符号编码为 un​​icode,请使用以下代码:

let msg:String = ""

extension String {
    var encodeEmoji: String{
        if let encodeStr = NSString(cString: self.cString(using: .nonLossyASCII)!, encoding: String.Encoding.utf8.rawValue){
            return encodeStr as String
        }
        return self
    }
}

let msgdata:String = msg.encodeEmoji

send encoded string to server..

要将 unicode 解码为表情符号,请使用以下代码:

While getting your responce from the server which is unicode. 
decode that unicode to Emoji with below code

extension String {
    var decodeEmoji: String{
        let data = self.data(using: String.Encoding.utf8);
        let decodedStr = NSString(data: data!, encoding: String.Encoding.nonLossyASCII.rawValue)
        if let str = decodedStr{
            return str as String
        }
        return self
    }
}

let decodedstring = "Your Unicode String".decodeEmoji

如果有人正在寻找答案。我就是这样修复的

对于Android: 在你的 gradle 文件中添加以下依赖项

compile 'org.apache.commons:commons-lang3:3.6'

然后在向服务器发送消息时使用此编码文本

String msg = "User message here with emoji";
msg = StringEscapeUtils.escapeJava(msg);

并在从服务器接收消息后解码,使用以下命令

String msg = "User message here with emoji";
msg = StringEscapeUtils.unescapeJava(text);

对于iOS: (使用@Ankit Chauhan 的回答)

let msg:String = ""

extension String {
var encodeEmoji: String{
    if let encodeStr = NSString(cString: self.cString(using: .nonLossyASCII)!, encoding: String.Encoding.utf8.rawValue){
        return encodeStr as String
    }
    return self
 }
}
let msgdata:String = msg.encodeEmoji

并使用这个进行解码:

extension String {
var decodeEmoji: String{
    let data = self.data(using: String.Encoding.utf8);
    let decodedStr = NSString(data: data!, encoding: String.Encoding.nonLossyASCII.rawValue)
    if let str = decodedStr{
        return str as String
    }
    return self
 }
}

let decodedstring = "Your Unicode String".decodeEmoji

对于Android,我必须做两件事。

  1. 当我向服务器发送消息时使用 escapeJava,当接收消息时使用 unescapeJava

    'org.apache.commons:commons-lang3' //deprecated, dont use
     org.apache.commons:commons-text:1.2'
    
     StringEscapeUtils.escapeJava(message)
     StringEscapeUtils.unescapeJava(message)
    
  2. 使用来自 google

  3. 的 EmojiCompat 库

https://developer.android.com/guide/topics/ui/look-and-feel/emoji-compat.html