使用Spring MVC和Ajax返回字符串时编码错误
问题内容:
我有一个网页,该网页使用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);
}
});
有任何想法我在这里做错了吗?
问题答案:
发生这种情况是因为默认情况下,AJAX调用使用浏览器的默认编码(fe ANSI)。要对此进行覆盖,您需要执行以下操作:
jQuery的风格 - mime类型 :
$.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")
但是从另一方面来说,您需要确定该服务器还会返回适当的响应。为此,您需要检查以下内容:
- 通过在 server.xml中* 为 连接器 设置添加 URIEncoding =“ UTF-8” 来添加对Web容器(即Tomcat)的UTF-8支持;检查此以获取更多信息。 ***
- 如果以前的更改没有帮助(尽管有帮助),请确保servlet响应的字符集也是 UTF-8 。
为此,您可以使用方法的显式调用:
@RequestMapping("get_label")
public @ResponseBody String getLabel(HttpServletResponse response)
{
String str = "בדיקה";
//set encoding explicitly
response.setCharacterEncoding("UTF-8");
return str;
}
或者,对于@ResponseBody
Spring 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调用,您必须确保:
- 网络容器正确支持此功能
- 响应的字符编码为UTF-8
- AJAX请求字符编码也为UTF-8