如何通过 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 编码发送字符的主要内容,如果未能解决你的问题,请参考以下文章