使用Spring MVC和ajax返回字符串时编码错误

koe*_*la1 6 java ajax encoding spring-mvc

我有一个网页,使用Ajax请求希伯来字符串,但字符串返回为"??????"

奇怪的是,当使用JSTL而不是Ajax将相同的字符串插入页面时,它显示正确...

在我的网页上,我正在宣布

<%@ page contentType="text/html" pageEncoding="UTF-8"%>
Run Code Online (Sandbox Code Playgroud)

那是我的控制器:

@RequestMapping("get_label")   
public @ResponseBody String getLabel()
{
   String str = "?????";

   return str;
}
Run Code Online (Sandbox Code Playgroud)

我的ajax请求:

$.ajax({
    url:    "get_label",
    success:    function(result)
    {
        alert(result);
        $("#parameter_select label").text(result);
    }
});
Run Code Online (Sandbox Code Playgroud)

我有什么想法在这里做错了吗?

n1c*_*las 15

发生这种情况是因为AJAX调用默认使用浏览器的默认编码(fe ANSI).为了覆盖这个,你需要做:

jQuery 样式 - mimeType:

$.ajax({
    url:    "get_label",
    mimeType:"text/html; charset=UTF-8",
    success:    function(result)
    {
        alert(result);
        $("#parameter_select label").text(result);
    }
});
Run Code Online (Sandbox Code Playgroud)

香草JS 风格:

xhr.overrideMimeType("text/html; charset=UTF-8")
Run Code Online (Sandbox Code Playgroud)

但另一方面,您需要确定,该服务器也会返回适当的响应.为此,您需要检查以下内容:

  1. 为web容器添加UTF-8支持(即Tomcat),为server.xml中Connector设置添加URIEncoding ="UTF-8" ; 检查这个以获取更多信息.
  2. 如果以前的更改没有帮助(尽管必须),请确保servlet响应的字符集也是UTF-8.

为此,您可以使用显式调用方法:

@RequestMapping("get_label")
public @ResponseBody String getLabel(HttpServletResponse response)
{
    String str = "?????";

    //set encoding explicitly
    response.setCharacterEncoding("UTF-8");

    return str;
}
Run Code Online (Sandbox Code Playgroud)

或者,这似乎更适合@ResponseBody和Spring 3.1+:

@RequestMapping(value = "get_label", produces = "text/html; charset=UTF-8")
public @ResponseBody String getLabel(HttpServletResponse response)
{
    String str = "?????";

    return str;
}
Run Code Online (Sandbox Code Playgroud)

作为结论,我想澄清一点,为了正确处理使用UTF-8编码的AJAX调用,你必须确保:

  • Web容器支持这一点
  • 响应的字符编码是UTF-8
  • AJAX请求字符编码也是UTF-8

  • 惊人!有用!谢谢:)我添加--products ="text/html; charset = UTF-8" - 就这样做了 (3认同)