【问题标题】:Transferring strings containing emotions to server将包含情绪的字符串传输到服务器
【发布时间】:2016-03-13 16:07:29
【问题描述】:

每当用户输入 ???? 等移动表情符号时,在我的网站上进入输入字段,它将被保存为??在我的数据库中。

那些表情符号是用 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);
        ...

}

对于表情符号,Logger 输出已经是 ??

路线如下:

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有关

【问题讨论】:

    标签: javascript java ajax playframework


    【解决方案1】:

    所以对于任何在这里遇到类似问题的人,我的解决方法。

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

    我所做的是将接收到的字符串转换为 unicode,然后转换为 base64,当我从数据库加载字符串时,我首先解码 base64,然后将 unicode 信息转换为实际的字符串。这样表情符号就会被存储,然后正确显示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-20
      • 2015-03-12
      • 1970-01-01
      • 1970-01-01
      • 2016-06-10
      • 1970-01-01
      • 2014-10-14
      • 1970-01-01
      相关资源
      最近更新 更多