Frage

Ich habe eine Standardinstallation von Tomcat 7 und alles Java-bezogene konfiguriert Verwendung utf-8.

Das funktioniert nicht (utf-8-Zeichen sind verstümmelt):

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

Dies tut, aber protokolliert 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);
    }
%>

Ich habe gesucht, aber gefunden keine Antworten. Ist das ein Fehler in Tomcat, oder gibt es etwas, was ich bin fehlt?

War es hilfreich?

Lösung

Wenn Sie konstruieren InputStreamReader ohne Angabe ein charset als zweites Argument, dann wird die Plattform Standard-Kodierung verwendet werden, die oft ISO-8859-1 ist. Sie müssen die gleiche charset angeben, wie in den Antwort-Header der Ziel-URL angegeben, die UTF-8 ist.

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

Die IllegalStateException verursacht, weil Sie diese in einer JSP anstelle eines Servlet tun. Die JSP intern verwendet response.getWriter() , aber Sie anrufen response.getOutputStream() in einer JSP scriptlet . Dies kann nicht gleichzeitig durchgeführt werden, wie in ihrer javadocs erläutert. Auch ist die doppelte Schleife weit davon entfernt effizient. Nur schreibt sofort out (das ist response.getWriter()) in der ersten Schleife, anstatt zu einem gewissen Puffer.

Egal, das ist eine schreckliche Art und Weise von Proxying. verwenden lieber ein Servlet oder greifen JSTL <c:import> statt.

<c:import url="http://en.wikipedia.org/wiki/Main_Page" /> 
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top