我的Servlet不会使用UTF-8进行JSON响应。
MyServlet.java :
public class MyServlet extends HttpServlet {
protected void doPost(HttpServletRequest req, HttpServletResponse res) throws Exception {
PrintWriter writer = res.getWriter();
res.setCharacterEncoding("UTF-8");
res.setContentType("application/json; charset=UTF-8");
writer.print(getSomeJson());
}
}
但是特殊字符没有出现,当我检查我在Firebug中找回的标题时,我看到Content-Type: application/json;charset=ISO-8859-1
。
我在我的Servlet目录中做了一个grep -ri iso .
,并且什么都没有,所以我没有明确地将类型设置为ISO-8859-1。
我还应该指定我在Eclipse中的Tomcat 7上以J2EE目标作为开发环境运行它,使用Solaris 10以及他们称之为Web服务器环境的任何人(其他人管理它)作为生产环境,并且行为是一样的。
我也确认提交的请求是UTF-8,只有响应是ISO-8859-1。
我修改了代码以反映我在设置字符编码之前调用PrintWriter。我从原来的例子中省略了这一点,现在我意识到这是我问题的根源。我在阅读HttpServletResponse.getWriter()
之前阅读here您必须设置字符编码,否则getWriter会将其设置为ISO-8859-1。
这是我的问题。所以上面的例子应该调整为
public class MyServlet extends HttpServlet {
protected void doPost(HttpServletRequest req, HttpServletResponse res) throws Exception {
res.setCharacterEncoding("UTF-8");
res.setContentType("application/json");
PrintWriter writer = res.getWriter();
writer.print(getSomeJson());
}
}
答案 0 :(得分:4)
为响应设置编码后,无法更改。
强制使用UTF-8的最简单方法是创建自己的过滤器,这是第一个查看响应并设置编码的过滤器。
看看how Spring 3.0 does this。即使您不能在项目中使用Spring,也许您可以获得一些灵感(确保您的公司政策允许您从开源许可证中获取灵感)。
答案 1 :(得分:1)
代码看起来很好。要么你没有运行你认为正在运行的代码,要么在请求 - 响应链中的某个地方有一些Filter
或代理,它会像这样修改内容类型。
答案 2 :(得分:0)
除了特定的问题,你真的应该考虑获取输出流,使用JSON库直接以UTF-8编码的JSON编写内容;使用作家没有任何好处。 一些JSON包只能使用字符串,这是不幸的,但大多数允许使用更高效的流(更安全,更高效,因为解析器/生成器可以一起处理转义和编码方面)。