0

このサーブレットを使用して、別のドメインからHTMLコンテンツを抽出し、Ajaxを使用して自分のページに含めます。これにより、応答が「UTF-8」として指定されます。

public class ProxyServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException  {
        String urlString = request.getParameter("url");
        try {
            URL url = new URL(urlString);
            url.openConnection();            
            BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));
            response.setContentType("text/html; charset=UTF-8");
            PrintWriter out = new PrintWriter(new OutputStreamWriter(response.getOutputStream(), "UTF8"), true);
            char[] buf = new char[4 * 1024];
            int len;
            while ((len = reader.read(buf, 0, buf.length)) != -1) {
              out.write(buf, 0, len);
            }
            out.flush();
        }
        catch (MalformedURLException e) {     
            throw new ServletException(e);
        }
        catch (IOException e) {     
            throw new ServletException(e);
        }
    }
}

私が抽出しているドキュメントには、次のようなメタタグがあります。

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>

完全に一致するように、自分のページにコピーして貼り付けました。ブラウザのページ情報によると、間違いなく「UTF-8」エンコーディングを使用しています。それでも、抽出されたhtmlコンテンツで「&nbsp」ではなく「Â」が表示されます。

これらは実際にはこのからのresponseTextに含まれていProxyServletます。応答コンテンツタイプと出力ストリーム文字セットを明示的に定義することでこれを処理できると思いましたが、何かが足りないに違いありませんか?誰かが以前にこれを解決したことがありますか。

4

1 に答える 1

1

バイトストリームをcharsに、またはその逆に変換する代わりに、byte[]バッファを介してonyバイトストリームから別のストリームにコピーすることができます。または、Springutilを使用します。

FileCopyUtils.copy(uri.getInputStream(), response.getOutputStream());

または明示的に:

byte[] buffer = new byte[BUFFER_SIZE];
int bytesRead = -1;
while ((bytesRead = in.read(buffer)) != -1) {
    out.write(buffer, 0, bytesRead);
}
out.flush();

データがそのままコピーされることが保証されます(間違った文字を介して物事を台無しにする可能性はありません)

于 2012-04-14T18:09:41.880 に答える