質問

Tomcat 7 のデフォルト設定と Java 関連のすべてが utf-8 を使用するように設定されています。

これは機能しません (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 のバグですか、それとも何か足りないものがあるのでしょうか?

役に立ちましたか?

解決

施工するときは InputStreamReader 2 番目の引数として文字セットを指定しない場合は、プラットフォームのデフォルトのエンコーディングが使用されます。多くの場合、これは ISO-8859-1 です。ターゲット URL の応答ヘッダーに指定されているのと同じ文字セット (UTF-8) を指定する必要があります。

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

IllegalStateException これは、サーブレットではなく JSP でこれを実行しているために発生します。JSP が内部的に使用するのは、 response.getWriter(), 、でもあなたは電話をかけています response.getOutputStream() JSP内で スクリプトレット. 。Javadoc で説明されているように、これを同時に行うことはできません。また、二重ループは効率的とは程遠いです。すぐに書き込んでください out (つまり response.getWriter()) バッファーではなく、最初のループで。

いずれにしても、これはひどいプロキシ方法です。むしろサーブレットを使用するか、JSTL を取得してください <c:import> その代わり。

<c:import url="http://en.wikipedia.org/wiki/Main_Page" /> 
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top