将包含情感的字符串传输到服务器

时间:2016-03-13 16:07:30

标签: javascript java ajax playframework

在我的网站上,只要用户输入移动表情符号,就像输入字段一样,它将被保存为??在我的数据库中。

那些表情符号是用utf8mb4编码的,所以我已经将我的数据库整理更新为utf8mb4_general_ci。

虽然现在可以在将包含表情符号的消息从客户端传输到我的服务器时成功保存表情符号,但它仍然可以在某处变为?我现在正试图弄清楚在哪里以及如何解决它。

在此ajax调用中发送消息到我的服务器:

function updateStatus() {
    var status = $("#status").val();

    jsRoutes.controllers.Userdata.updateStatus( status ).ajax({
        success : function(data) {
              $("#profil").cftoaster({content: data});
        },
        error : function(err) {
              $("#profil").cftoaster({content: err.responseText});
        }
    });
}

在服务器端,我使用的是基于Java的Play Framework 2.4.4。 这是在ajax调用中调用的方法的开头:

public static Result updateStatus(String status) {

        String receivedName = Application.getSessionUser();
        Logger.debug("RecvStatus: " + status);
        ...

}

对于表情符号,记录器输出已经是??

路线如下:

PUT         /status/                          controllers.Userdata.updateStatus(status: String)

修改

为了确保从客户端到服务器的传输正常,我现在正在传输实际的unicode值,我改变了我的服务器功能

Logger.debug("RecvStatus: " + status);
status = status.replace("\\","");
String[] arr = status.split("u");
status = "";
for(int i = 1; i < arr.length; i++){
    int hexVal = Integer.parseInt(arr[i], 16);
    status += (char)hexVal;
}
Logger.debug("RecvStatus: " + status);

并获得以下输出:

[debug] application - RecvStatus: \ud83d\ude01
[debug] application - RecvStatus: ?

这意味着问题可能在于java

1 个答案:

答案 0 :(得分:0)

所以对于任何有类似问题的人来说,我的解决方法。

首先,我尝试将java中的String转换为base64并以这种方式存储它。不幸的是,在解码base64之后,unicode信息仍然丢失了。显示而不是表情符号。

我所接受的是将收到的String转换为unicode而不是base64,当我从数据库加载Strings时,首先解码base64,然后将unicode信息转换为实际的String。这样就可以存储表情符号并在之后正确显示。