2010-11-22 4 views
2

Ich habe eine Standardkonfiguration von Tomcat 7 und alles, was Java-bezogene konfiguriert, um utf-8 zu verwenden.Tomcat's JspWriter nicht korrekt codieren

Dies 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 logs 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 keine Antworten gefunden. Ist das ein Fehler in Tomcat, oder fehlt mir etwas?

+0

Dies ist das kleinste Beispiel, das ich schreiben konnte, das das Problem aufzeigte, ohne irgendwelche Datenbanken einzubeziehen. Der echte Code sieht nicht so aus. – OrangeDog

Antwort

3

Wenn Sie InputStreamReader ohne Angabe eines Zeichensatzes als zweites Argument erstellen, wird die Standardcodierung der Plattform verwendet, die häufig ISO-8859-1 lautet. Sie müssen den gleichen Zeichensatz angeben, der im Antwortheader der Ziel-URL angegeben ist. Dies ist UTF-8.

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

Die IllegalStateException wird dadurch verursacht, dass Sie anstelle eines Servlet in einer JSP dies zu tun sind. Die JSP verwendet intern response.getWriter(), aber Sie rufen response.getOutputStream() in einem JSP Skriptlet. Dies kann nicht gleichzeitig wie in ihren Javadocs erklärt erfolgen. Außerdem ist die Doppelschleife weit davon entfernt, effizient zu sein. Schreiben Sie einfach sofort an out (das ist) in der ersten Schleife anstelle von einigen Puffer.

Unabhängig davon ist dies eine schreckliche Art der Proxying. Verwenden Sie stattdessen ein Servlet oder greifen Sie stattdessen auf JSTL <c:import>.

<c:import url="http://en.wikipedia.org/wiki/Main_Page" /> 
+0

Danke, ich gebe das, wenn ich die Chance habe. – OrangeDog