2010-11-22 50 views
2

我有一個默認設置的Tomcat 7和所有與java相關的配置爲使用utf-8。Tomcat的JspWriter編碼不正確

這不起作用(UTF-8字符錯位):

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

這種做法,但日誌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); 
    } 
%> 

我一直在尋找,但沒有找到答案。這是Tomcat中的一個錯誤,還是我缺少的東西?

+0

這是我可以寫出的最小的例子,展示了這個問題,而不涉及任何數據庫。真正的代碼看起來不像它。 – OrangeDog 2010-11-22 23:08:32

回答

3

當您構造InputStreamReader而未指定字符集作爲第二個參數時,將使用平臺默認編碼,通常是ISO-8859-1。您需要指定與目標URL的響應標頭中指定的字符集相同的字符集,即UTF-8。

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

IllegalStateException,是因爲你在一個JSP這樣做,而不是一個Servlet引起的。 JSP在內部使用response.getWriter(),但您在JSP scriptlet中調用response.getOutputStream()。這不能像javadocs中解釋的那樣同時完成。而且,雙循環遠沒有效率。只需在第一個循環中立即寫入out(即response.getWriter()),而不是寫入某個緩衝區。

無論如何,這是一個可怕的代理方式。取而代之的是使用Servlet或抓取JSTL <c:import>

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

謝謝,當我有機會時,我會放棄這一點。 – OrangeDog 2010-11-22 23:06:21