2

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

これは機能しません(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のバグですか、それとも私が見逃しているものがありますか?

4

1 に答える 1

4

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

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

これIllegalStateExceptionは、サーブレットではなくJSPでこれを行っているために発生します。JSPは内部でを使用しますが、JSPスクリプトレットresponse.getWriter()で呼び出しています。javadocsで説明されているように、これを同時に実行することはできません。response.getOutputStream()

于 2010-11-22T18:15:38.560 に答える