2010-09-17 50 views
12

我的Servlet不会使用UTF-8作为JSON响应。为什么我的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作为开发环境,使用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()); 
    } 
} 
+1

感谢您的“更新”,这正是我正在寻找的:首先设置字符编码,其次获取作家。 – 2014-06-16 17:16:10

回答

4

为响应设置编码后,无法更改。

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

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

+0

你是对的,无法改变编码。我设置了两次,但没有明确。我是用getWriter隐式地做的。看到我更新的问题。感谢您的帮助和+1。 – 2010-09-17 19:19:53

1

代码看起来不错。要么你没有运行你认为正在运行的代码,要么有一些Filter或代理在请求 - 响应链中的某处修改内容类型。

+0

我不知道这会发生在哪里,除非它是我的环境的默认行为。有一个源文件,我从头开始编写它。但这也是我的第一个Servlet,所以我不知道'Filter'是什么。 – 2010-09-17 17:35:43

+0

webapp的'/ WEB-INF/web.xml'中没有其他的东西? Tomcat的版本究竟是什么?下载/安装后,你在'/ conf/web.xml'文件中修改了什么? – BalusC 2010-09-17 17:52:57

+0

没有别的。看到我更新的问题。 – 2010-09-17 18:01:57

0

除了具体问题,你真的应该考虑获取输出流,使用JSON库直接编写内容为UTF-8编码的JSON;使用作家没有任何好处。 一些JSON包只能用于字符串,这是不幸的,但大多数允许使用更高效的流(解析器/生成器可以处理转义和编码方面更安全和更高效)。

+0

谢谢你的建议。我会研究这个。这是我的第一个servlet,所以我对可用的库不太熟悉。我必须使用我们的默认Solaris 10环境中提供的任何东西。 – 2010-09-19 18:13:07

相关问题