【发布时间】:2011-04-13 20:02:14
【问题描述】:
我的 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。我从原始示例中省略了这一点,现在我意识到这是我的问题的根源。我读到here,您必须在调用HttpServletResponse.getWriter() 之前设置字符编码,否则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());
}
}
【问题讨论】:
-
感谢您的“更新”,这正是我正在寻找的:首先设置字符编码,其次获取作者。
标签: java json servlets encoding http-headers