我的 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 ":[{"登录":"用户??????"}]}
谢谢, 阿雷克