2010-11-22 44 views
2

我有一个默认设置的Tomcat 7和所有与java相关的配置为使用utf-8。Tomcat的JspWriter编码不正确

这不起作用(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中的一个错误,还是我缺少的东西?

+0

这是我可以写出的最小的例子,展示了这个问题,而不涉及任何数据库。真正的代码看起来不像它。 – OrangeDog 2010-11-22 23:08:32

回答

3

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

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

IllegalStateException,是因为你在一个JSP这样做,而不是一个Servlet引起的。 JSP在内部使用response.getWriter(),但您在JSP scriptlet中调用response.getOutputStream()。这不能像javadocs中解释的那样同时完成。而且,双循环远没有效率。只需在第一个循环中立即写入out(即response.getWriter()),而不是写入某个缓冲区。

无论如何,这是一个可怕的代理方式。取而代之的是使用Servlet或抓取JSTL <c:import>

<c:import url="http://en.wikipedia.org/wiki/Main_Page" /> 
+0

谢谢,当我有机会时,我会放弃这一点。 – OrangeDog 2010-11-22 23:06:21