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的一个bug,或者是有什么我失踪?
解决方案
当您构造 InputStreamReader
而不指定一个字符集作为第二参数,则平台默认编码将被使用,这常常是ISO-8859-1。需要指定相同的字符集作为目标URL的响应报头,这是UTF-8指定。
input = new BufferedReader(new InputStreamReader(target.openStream(), "UTF-8"));
因为你在一个JSP,而不是一个Servlet这样做的IllegalStateException
造成。该JSP内部使用 response.getWriter()
,但你打电话 response.getOutputStream()
一>在JSP 的scriptlet 。这可以作为他们的javadoc解释不能同时进行。此外,双循环远未有效。只是立即写入out
(这是response.getWriter()
)在第一回路,而不是一些缓冲。
无论如何,这是代理的可怕的方式。而使用一个Servlet或抓斗JSTL <c:import>
一>代替。
<c:import url="http://en.wikipedia.org/wiki/Main_Page" />
不隶属于 StackOverflow