7

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

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

在我的网页中,我声明

<%@ page contentType="text/html" pageEncoding="UTF-8"%>

那是我的控制器:

@RequestMapping("get_label")   
public @ResponseBody String getLabel()
{
   String str = "בדיקה";

   return str;
}

我的ajax请求:

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

任何想法我在这里做错了什么?

4

1 回答 1

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);
    }
});

香草 JS风格

xhr.overrideMimeType("text/html; charset=UTF-8")

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

  1. 添加对 web 容器(即 Tomcat)的 UTF-8 支持,并在server.xml中为您的连接器设置添加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;
}

或者,这似乎更适合@ResponseBodySpring 3.1+:

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

    return str;
}

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

  • web-container 正确支持这一点
  • 响应的字符编码是 UTF-8
  • AJAX请求字符编码也是UTF-8
于 2013-03-04T15:40:17.033 回答