2010-01-02 3 views
43

Mi código de servlet que se parece a:cómo enviar a través de personajes ServletOutputStream en codificación UTF-8

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

...

luego me sale el 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) 

¿Cómo puede ¿Cambio el juego de caracteres de la salida de Servlet?

Respuesta

78

Creo que desea utilizar getWriter() en su lugar. Eso aceptará una cadena y la codificará, mientras que la secuencia de salida es para manejar datos binarios.

Desde el 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.

Aquí es el cambio del código:

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

probado - Funcionó! Te llevó menos de 5 min. para resolverlo Trataré de encontrar una pregunta más difícil la próxima vez ... – GyRo

+9

No. Por favor. No :-) –

+0

+1 - trabajo increíble. – duffymo

3

El mismo caso sucede a mí antes y yo tratamos de complemento en una línea en la parte superior de la PrintStream y es trabajo

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

7

Esto también funciona:

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

trabajando para mí también, pero ¿por qué funciona con 'write' pero no con' print'/'println'? – moeTi

+0

@moeTi Esto es extraño para mí también. Alguna explicacion? – Zouzias

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