Tomcat の JspWriter が正しくエンコードされない
-
27-09-2019 - |
質問
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" />
所属していません StackOverflow