how to send through ServletOutputStream characters in UTF-8 encoding

JavaServletsUtf 8Internationalization

Java Problem Overview


My servlet code looks like that:

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

...

then I get the error:

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)

How can I switch the charset of Servlet's outputstream ???

Java Solutions


Solution 1 - Java

I think you want to use getWriter() instead. That will accept a string and encode it, whereas the output stream is for handling binary data.

From the doc:

> Returns a PrintWriter object that can > send character text to the client. The > character encoding used is the one > specified in the charset= property of > the setContentType(java.lang.String) > method, which must be called before > calling this method for the charset to > take effect. > > Either this method or > getOutputStream() may be called to > write the body, not both.

Here's the change of the code:

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

Solution 2 - Java

This also works:

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

Solution 3 - Java

The same case happen to me before and i tried to add-on one line on top of the PrintWriter and it is work.

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

Solution 4 - Java

In the case where you have to Request Dispatcher from a doFilter to @WebServlet("/anywebpage") which should only contain the PrintWriter out = response.getWriter();

        String erpg = "anywebpage";
        response.setContentType("text/html; charset=UTF-8");
        RequestDispatcher rd = request.getRequestDispatcher(erpg);
        rd.include(request, response);

You should NOT require to declare the following line: response.setCharacterEncoding("UTF-8");

Instead, make sure to include the following before the PrintWriter out = response.getWriter(); instruction:

response.setContentType("text/html; charset=UTF-8");

Solution 5 - Java

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();
}

Solution 6 - Java

// 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 );

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionGyRoView Question on Stackoverflow
Solution 1 - JavaBrian AgnewView Answer on Stackoverflow
Solution 2 - JavaquagmiredView Answer on Stackoverflow
Solution 3 - JavaKimView Answer on Stackoverflow
Solution 4 - JavaQA SpecialistView Answer on Stackoverflow
Solution 5 - JavaAllenView Answer on Stackoverflow
Solution 6 - Java이대범View Answer on Stackoverflow