Domanda

Ho una configurazione di default di Tomcat 7 e tutto relativi a Java configurato per utilizzare utf-8.

Questo non funziona (UTF-8 caratteri vengono alterati):

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

Questo non fa, ma 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);
    }
%>

Ho cercato ma non ha trovato risposte. Questo è un bug in Tomcat, o c'è qualcosa che mi manca?

È stato utile?

Soluzione

Quando si costruisce InputStreamReader senza specificare un set di caratteri come 2 ° argomento, quindi la codifica predefinita piattaforma sarà utilizzata, che spesso è ISO-8859-1. È necessario specificare lo stesso set di caratteri, come specificato nell'intestazione della risposta del URL di destinazione, che è UTF-8.

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

Il IllegalStateException è causato perché si sta facendo questo in una JSP invece di una Servlet. JSP utilizza internamente response.getWriter() , ma si sta chiamando response.getOutputStream() in una JSP scriptlet . Questo non può essere fatto contemporaneamente come spiegato nelle loro javadocs. Inoltre, il doppio anello è tutt'altro che efficiente. Basta scrivere immediatamente out (che è response.getWriter()) nel primo ciclo anziché a qualche tampone.

Indipendentemente da ciò, questo è un modo terribile di proxy. Piuttosto usare una servlet o afferrare JSTL <c:import> invece.

<c:import url="http://en.wikipedia.org/wiki/Main_Page" /> 
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top