Pergunta

Eu tenho uma configuração padrão do Tomcat 7 e tudo relacionado ao Java configurado para usar o UTF-8.

Isso não funciona (os caracteres da UTF-8 são mutilados):

<%@ 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);
    } 
%>

Isso faz, mas registra ilegalstateExceptions:

<%@ 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);
    }
%>

Eu tenho procurado, mas não encontrei respostas. Isso é um bug no tomcat, ou há algo que estou perdendo?

Foi útil?

Solução

Quando você constrói InputStreamReader Sem especificar um conjunto de charset como segundo argumento, a codificação padrão da plataforma será usada, que geralmente é ISO-8859-1. Você precisa especificar o mesmo charset especificado no cabeçalho da resposta do URL de destino, que é o UTF-8.

input = new BufferedReader(new InputStreamReader(target.openStream(), "UTF-8"));

o IllegalStateException é causado porque você está fazendo isso em um JSP em vez de um servlet. O JSP usa internamente response.getWriter(), mas você está ligando response.getOutputStream() em um jsp roteiro. Isso não pode ser feito simultaneamente, conforme explicado em seus javadocs. Além disso, o loop duplo está longe de ser eficiente. Basta escrever imediatamente para out (qual é response.getWriter()) no primeiro loop, em vez de para algum buffer.

Independentemente disso, essa é uma maneira terrível de procurar. Em vez disso, use um servlet ou pegue jstl <c:import> em vez de.

<c:import url="http://en.wikipedia.org/wiki/Main_Page" /> 
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top