为什么我的 Servlet 不能响应 UTF-8 中的 JSON 请求?更新

2022-09-04 23:06:45

我的 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目录中做了一个,但什么也没得到,所以我没有一个地方明确地将类型设置为ISO-8859-1。grep -ri iso .

我还应该指定我在 Eclipse 中的 Tomcat 7 上运行此内容,其 J2EE 目标作为开发环境,Solaris 10 和他们称之为 Web 服务器环境的任何内容(其他人管理此环境)作为生产环境,并且行为是相同的。

我还确认提交的请求是 UTF-8,只有响应是 ISO-8859-1。

更新

我已经修改了代码,以反映在设置字符编码之前我正在调用PrintWriter。我从原来的例子中省略了这一点,现在我意识到这是我问题的根源。我在这里读到,在调用之前必须设置字符编码,否则getWriter将为您将其设置为ISO-8859-1。HttpServletResponse.getWriter()

这是我的问题。所以上面的例子应该调整为

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());
  }
}

答案 1

一旦为响应设置了编码,就无法更改它。

强制 UTF-8 的最简单方法是创建自己的过滤器,这是第一个查看响应并设置编码的过滤器。

看看Spring 3.0是如何做到这一点的。即使您不能在项目中使用Spring,也许您也可以获得一些灵感(确保您的公司政策允许您从开源许可证中获得灵感)。


答案 2

代码看起来很好。要么你没有运行你认为你正在运行的代码,要么在请求-响应链的某个地方有一些或代理可以像这样修改内容类型。Filter