2010-11-22 16 views
2

私は、Tomcat 7のデフォルト設定と、java関連のutf-8を使用するように設定しました。TomcatのJspWriterが正しくエンコードされていない

<%@ 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:

これは動作しません(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()); 
    OutputStreamWriter output = new OutputStreamWriter(response.getOutputStream()); 
    n = 0; 
    while (-1 != (n = reader.read(chrs))) 
    { 
     output.write(chrs, 0, n); 
    } 
%> 

は、私が検索してきたが、何の答えを見つけていません。これはTomcatのバグですか、それとも私が紛失しているものがありますか?

+0

これは、データベースを使用せずに問題を示した最小の例です。実際のコードはそれと似ていないようです。 – OrangeDog

答えて

3

第2引数として文字セットを指定せずにInputStreamReaderを作成すると、プラットフォームのデフォルトのエンコーディングが使用されます。これはISO-8859-1です。ターゲットURLのレスポンスヘッダー(UTF-8)で指定されているのと同じ文字セットを指定する必要があります。あなたはサーブレットの代わりにJSPでこれをやっているので、

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

IllegalStateException

が生じます。 JSPは内部で response.getWriter()を使用していますが、 スクリプトレットresponse.getOutputStream()を呼び出しています。これはjavadocsで説明したように同時に行うことはできません。また、ダブルループは効率的ではありません。最初のループの一部のバッファではなく、 out(これは response.getWriter())にただちに書き込みます。

これにかかわらず、これはプロキシ処理のひどい方法です。むしろServletを使うか、JSTL <c:import>を代わりに入手してください。

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

ありがとう、私はチャンスがあるときにそれを与える。 – OrangeDog

関連する問題