gpt4 book ai didi

java - 为什么我的 Servlet 不响应 UTF-8 格式的 JSON 请求?

转载 作者:搜寻专家 更新时间:2023-10-30 21:11:52 24 4
gpt4 key购买 nike

我的 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 中的 header 时,我看到了 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。

更新

我修改了代码以反射(reflect)我在设置字符编码之前调用 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());
}
}

最佳答案

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

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

看看how Spring 3.0 does this .即使您不能在您的项目中使用 Spring,也许您可​​以获得一些灵感(确保您的公司政策允许您从开源许可证中获得灵感)。

关于java - 为什么我的 Servlet 不响应 UTF-8 格式的 JSON 请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3737358/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com