2013-03-04 50 views
5

我有一个网页请求使用Ajax的希伯来字符串,但字符串返回为'??????'使用Spring MVC&ajax返回字符串时出现错误的编码

奇怪的是,使用JSTL,而不是阿贾克斯插入相同的字符串到页面时,它显示正确...

在我的网页我声明了

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

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

回答

14

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

jQuery的style - mime类型

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

香草JS style

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

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

  1. 添加Web容器(如Tomcat)的UTF-8支持与server.xml中添加的URIEncoding = “UTF-8”连接器设置;请查询this了解更多信息。
  2. 如果以前的更改没有帮助(尽管需要),还请确保该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调用,您必须确保:

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

不工作...仍然得到 '????' – koela1 2013-03-04 15:45:47

+0

出于测试目的,请考虑清除浏览器的缓存,因为JS缓存得很好。 – n1ckolas 2013-03-04 15:54:42

+0

如果没有帮助,那么问题应该在服务器端。在这种情况下,请你提供:1)你的春天版本; 2)你的网络容器 – n1ckolas 2013-03-04 16:55:07