JspWriter de Tomcat no codificar correctamente
-
27-09-2019 - |
Pregunta
Tengo una configuración por defecto de Tomcat 7 y todo lo relacionado con Java-configurado para utilizar UTF-8.
Esto no funciona (UTF-8 caracteres se truncan):
<%@ page language="java" pageEncoding="utf-8" contentType="text/html; charset=utf-8"%>
<%@ page import="java.net.*" %>
<%@ page import="java.io.*" %>
<%
URL target = new URL("http://en.wikipedia.org/wiki/Main_Page");
Reader input = new BufferedReader(new InputStreamReader(target.openStream()));
StringWriter buffer = new StringWriter();
char[] chrs = new char[1024 * 4];
int n = 0;
while (-1 != (n = input.read(chrs)))
{
buffer.write(chrs, 0, n);
}
StringReader reader = new StringReader(buffer.toString());
n = 0;
while (-1 != (n = reader.read(chrs)))
{
out.write(chrs, 0, n);
}
%>
Esto hace, pero registra IllegalStateExceptions:
<%@ page language="java" pageEncoding="utf-8" contentType="text/html; charset=utf-8"%>
<%@ page import="java.net.*" %>
<%@ page import="java.io.*" %>
<%
URL target = new URL("http://en.wikipedia.org/wiki/Main_Page");
Reader input = new BufferedReader(new InputStreamReader(target.openStream()));
StringWriter buffer = new StringWriter();
char[] chrs = new char[1024 * 4];
int n = 0;
while (-1 != (n = input.read(chrs)))
{
buffer.write(chrs, 0, n);
}
StringReader reader = new StringReader(buffer.toString());
OutputStreamWriter output = new OutputStreamWriter(response.getOutputStream());
n = 0;
while (-1 != (n = reader.read(chrs)))
{
output.write(chrs, 0, n);
}
%>
He estado buscando pero no encontraron respuestas. Es esto un error en Tomcat, o hay algo que me falta?
Solución
Al construir InputStreamReader
sin especificar un juego de caracteres como segundo argumento, entonces el valor predeterminado plataforma de codificación será utilizado, que es a menudo ISO-8859-1. Es necesario especificar el mismo juego de caracteres como se especifica en la cabecera de la respuesta de la dirección URL de destino, que es UTF-8.
input = new BufferedReader(new InputStreamReader(target.openStream(), "UTF-8"));
El IllegalStateException
es causado porque estás haciendo esto en un JSP en lugar de un servlet. El JSP utiliza internamente response.getWriter()
, pero que está llamando response.getOutputStream()
en un JSP scriplet . Esto no se puede hacer de forma simultánea como se explica en sus javadocs. Además, la doble bucle está lejos de ser eficiente. Sólo tiene que escribir inmediatamente a out
(que es response.getWriter()
) en el primer bucle en lugar de a algún buffer.
En cualquier caso, esta es una forma terrible de proxy. utilizar más bien un Servlet o grab JSTL <c:import>
lugar.
<c:import url="http://en.wikipedia.org/wiki/Main_Page" />