【问题标题】:Bad encoding when returning a string using Spring MVC & ajax使用 Spring MVC 和 ajax 返回字符串时编码错误
【发布时间】:2013-02-18 17:57:24
【问题描述】:

我有一个使用 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);
    }
});

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

【问题讨论】:

    标签: java ajax spring-mvc encoding


    【解决方案1】:

    这是因为 AJAX 调用默认使用浏览器的默认编码(例如 ANSI)。要覆盖它,您需要这样做:

    jQuery style - mimeType:

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

    原版JSstyle:

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

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

    1. 通过在 server.xml 中为您的 Connector 设置添加 URIEncoding="UTF-8",为 Web 容器(即 Tomcat)添加 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-container 正确支持这一点
    • 响应的字符编码为 UTF-8
    • AJAX 请求字符编码也是 UTF-8

    【讨论】:

    • 出于测试目的,请考虑清除浏览器的缓存,因为 JS 缓存得很好。
    • 如果它没有帮助,那么问题应该在服务器端。在这种情况下,您能否提供:1)您的春季版本; 2) 你的网络容器
    • 我使用的是 spring 版本 3.1.3 和 Tomcat 7
    • 太棒了!有用!谢谢 :) 我添加了 -produces = "text/html; charset=UTF-8" - 就这样
    • 太好了,我设法帮助了你。但无论如何,我建议不要使用mimeType 删除至少 AJAX 部分
    猜你喜欢
    • 2013-06-09
    • 2012-08-09
    • 2014-01-06
    • 1970-01-01
    • 1970-01-01
    • 2015-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多