【问题标题】:how to send through ServletOutputStream characters in UTF-8 encoding如何通过 ServletOutputStream 以 UTF-8 编码发送字符
【发布时间】: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 输出流的字符集???

【问题讨论】:

    标签: java servlets utf-8 internationalization


    【解决方案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();

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-06-09
            • 1970-01-01
            • 1970-01-01
            • 2013-04-25
            • 2011-06-25
            相关资源
            最近更新 更多