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

Posted

技术标签:

【中文标题】如何通过 ServletOutputStream 以 UTF-8 编码发送字符【英文标题】:how to send through ServletOutputStream characters in UTF-8 encoding 【发布时间】:2010-12-31 20:00:48 【问题描述】:

我的 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 输出流的字符集???

【问题讨论】:

【参考方案1】:

如果您必须从 doFilter 向 @WebServlet("/anywebpage") 请求 Dispatcher,它应该只包含 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");

【讨论】:

【参考方案2】:
// 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 );

【讨论】:

【参考方案3】:

我想你想改用getWriter()。这将接受一个字符串并对其进行编码,而输出流用于处理 binary 数据。

来自文档:

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

此方法或 可以调用 getOutputStream() 写正文,而不是两者兼而有之。

这里是代码的变化:

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

【讨论】:

试过了 - 成功了!花了你不到 5 分钟。解决它。下次我会尝试找到更难的问题... @skaffman - 是的。但是“MY-UTF-8 CODE”需要为此扩展:-) 你刚刚为我节省了几个小时,我敢肯定。 @Brian Agnew:非常感谢……经过近三天的调试和拉扯我的头发,这终于成功了。【参考方案4】:
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();

【讨论】:

【参考方案5】:

这也有效:

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

【讨论】:

也为我工作,但为什么它适用于 write 而不是 print/println @moeTi 这对我来说也很奇怪。有什么解释吗? @moeTi print 函数将以response 对象的字符编码中指定的格式对数据进行编码。如果没有设置 characterEncoding 标头,则默认使用 ISO-8859-1 github.com/eclipse/jetty.project/blob/jetty-9.4.x/jetty-server/…【参考方案6】:

我之前也遇到过同样的情况,我尝试在 PrintWriter 顶部添加一行,它是有效的。

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

【讨论】:

以上是关于如何通过 ServletOutputStream 以 UTF-8 编码发送字符的主要内容,如果未能解决你的问题,请参考以下文章

servletoutputstream写数据返回不完整

在文件下载时返回字节数组或servlet输出流之间是否存在差异?

Response对象通过字节流输出中文内容

response-下载文件步骤

Demo_通过JavaWeb完成文件下载

java文件下载