如何通过ServletOutputStream以UTF-8编码发送字符

64

我的servlet代码如下:

response.setContentType("text/html; charset=UTF-8");
response.setCharacterEncoding("UTF-8");
ServletOutputStream out = response.getOutputStream();
out.println(...MY-UTF-8 CODE...);

然后我收到了错误:

java.io.CharConversionException: Not an ISO 8859-1 character: ש
 javax.servlet.ServletOutputStream.print(ServletOutputStream.java:89)
 javax.servlet.ServletOutputStream.println(ServletOutputStream.java:242)
 rtm.servlets.CampaignLogicServlet.doPost(CampaignLogicServlet.java:68)
 javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
 javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

我该如何切换Servlet输出流的字符集?

6个回答

132
我认为你需要使用getWriter()。它能够接受一个字符串并对其进行编码,而输出流则用于处理二进制数据。
从文档中可以看到:

返回一个PrintWriter对象,该对象可以将字符文本发送到客户端。所使用的字符编码是setContentType(java.lang.String)方法中charset=属性指定的编码,必须在调用此方法之前调用该方法。要使字符集生效。

可以调用此方法或getOutputStream()方法中的一个来写入正文,但不能同时使用两者。

下面是代码更改:
response.setContentType("text/html; charset=UTF-8");
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
out.println(...MY-UTF-8 CODE...);

13

这也可以工作:

ServletOutputStream out = response.getOutputStream();
out.write("MY-UTF-8 CODE".getBytes("UTF-8")); 

1
对我也起作用了,但为什么用write可以,但用printprintln就不行呢? - moeTi
@moeTi 这对我来说也很奇怪。有什么解释吗? - Zouzias
@moeTi print函数将按照response对象的characterEncoding指定的格式对数据进行编码。如果您没有设置characterEncoding头,则默认使用ISO-8859-1 https://github.com/eclipse/jetty.project/blob/jetty-9.4.x/jetty-server/src/main/java/org/eclipse/jetty/server/Response.java#L902 - harshpatel991

4

我之前也遇到了同样的情况,并尝试在PrintWriter顶部添加一行代码,这样就可以解决问题。

response.setContentType("text/html; charset=GBK");
PrintWriter out = response.getWriter();


2
如果您需要在doFilter中从Request Dispatcher请求到@WebServlet("/anywebpage"),则该页面应仅包含PrintWriter out = response.getWriter();
        String erpg = "anywebpage";
        response.setContentType("text/html; charset=UTF-8");
        RequestDispatcher rd = request.getRequestDispatcher(erpg);
        rd.include(request, response);

您不需要声明以下行: response.setCharacterEncoding("UTF-8");
相反,在PrintWriter out = response.getWriter();指令之前,请确保包含以下内容:
response.setContentType("text/html; charset=UTF-8");

0
public void output(String jsonStr, HttpServletResponse response) throws IOException {
    response.setContentType("text/html;charset=UTF-8;");
    response.setCharacterEncoding("UTF-8");
    ServletOutputStream out = response.getOutputStream();
    out.write(jsonStr.getBytes("UTF-8"));
    out.flush();
    out.close();
}

0
// HTML Output code list
StringBuffer select_code = new StringBuffer();
List<con_element> ccc = codeService.code_select(code);

for(int i=0;i<ccc.size();i++){
    select_code.append("<option value='" + ccc.get(i).getCce_num() + "'>" + ccc.get(i).getCce_hname() + "</option>" );
}

response.setContentType("text/html; charset=UTF-8");
response.setCharacterEncoding("UTF-8");
response.getWriter().print( select_code );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接