1

我的 http 响应的字符编码有问题。我阅读了许多技巧、教程等,但我无法解决我的问题。我们使用带有 Hibernate 和 ExtJS 的 Spring MVC 作为视图技术。所有数据都使用控制器方法上的@ResponseBody 作为 JSON 返回。示例方法:

@RequestMapping(method = RequestMethod.POST, value = "dispatcher")
@ResponseBody
public String dispatcherPost(HttpServletRequest req, HttpServletResponse resp, HttpSession session) {
    return process(req, resp, session);
}

有简单的调度机制来调度 url 命令(在这种情况下并不重要)。Process 方法正在使用参数做一些事情并返回 JSON。此 JSON 包含例如来自数据库 (PostgreSQL 9.1.4) 的数据。Postgres 中的数据以 UTF-8 存储,并且“正确可见”,例如在 pgAdmin 中。在 Eclipse 中调试时,我们还可以看到有效数据(来自数据库)。看起来从 Postgres 获取数据一切正常。当我们想通过 @ResponseBody 注释方法返回它们时,问题就开始了。方法“进程”返回带有 utf-8 字符的有效字符串(我可以在调试模式下看到),但在 Web 浏览器(chrome、firefox)中有“?” 而不是存储在数据库中的波兰语字符。查看萤火虫,我可以看到响应标头部分有效:'内容类型:文本/html;charset=UTF-8'。我告诉'部分',因为我在处理方法中有这行代码:

`resp.setContentType("application/json;charset=UTF-8");`

其中 resp 是 HttpServletResponse。我试过从这个解决方案中添加 springs bean 后处理器:http://stackoverflow.com/questions/3616359/who-sets-response-content-type-in​​-spring-mvc-responsebody/3617594#3617594 但它没有有效。我在 web.xml 中也有字符编码过滤器

<!-- Force Char Encoding -->
<filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
 </filter-mapping>

所以基本上问题在于从服务器返回编码良好的 JSON。任何想法?

编辑:

我将代码粘贴到过程方法中:

System.err.println("测试" + System.getProperty("file.encoding"));
System.err.println("测试正常:" + response);
System.err.println("测试 cp1250:" + new String(response.getBytes(),"cp1250"));
System.err.println("测试 UTF-8:" + new String(response.getBytes(),"UTF-8"));

结果是这样的:

TEST Cp1250
TEST normal: {"users":[{"login":"userąęśćółżń"}]}
TEST cp1250: {"users":[{"login":"userąęśćółżń"}]}
TEST UTF-8: {"users ":[{"登录":"用户??????"}]}

谢谢, 阿雷克

4

1 回答 1

2

好的,使用 springs http 消息转换器的http://static.springsource.org/spring/docs/3.0.x/reference/remoting.html#rest-message-conversion和 @ResponseBody 注释似乎有些奇怪。我没有时间创建自定义消息转换器,所以我的解决方案是删除 @ResponseBody 注释并使用如下内容:

@RequestMapping(method = RequestMethod.GET, value = "dispatcher")
public void dispatcherGet(HttpServletRequest req, HttpServletResponse resp, HttpSession session) {
    String response =  process(req, resp, session);
    try {
        resp.getWriter().write(response);
        resp.getWriter().flush();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

也许这会对某人有所帮助。谢谢, 阿雷克

于 2012-07-23T11:10:15.717 回答