2

我有 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中的错误,还是我遗漏了什么?

4

1 回答 1

4

当您在InputStreamReader没有指定字符集作为第二个参数的情况下进行构建时,将使用平台默认编码,通常是 ISO-8859-1。您需要指定与目标 URL 的响应标头中指定的相同的字符集,即 UTF-8。

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

IllegalStateException是因为您在 JSP 而不是 Servlet 中执行此操作。JSP 内部使用response.getWriter(),但您调用response.getOutputStream()的是 JSP scriptlet。正如他们的 javadocs 中所解释的那样,这不能同时完成。

于 2010-11-22T18:15:38.560 回答