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?

¿Fue útil?

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" /> 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top