JspWriter Tomcat неправильно кодирует - PullRequest
2 голосов
/ 22 ноября 2010

У меня есть настройка по умолчанию 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 или мне чего-то не хватает?

1 Ответ

3 голосов
/ 22 ноября 2010

Когда вы создаете 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 . Это не может быть сделано одновременно, как объяснено в их Javadocs. Кроме того, двойной цикл далеко не эффективен. Просто напишите немедленно в out (то есть response.getWriter()) в первом цикле вместо какого-то буфера.

Несмотря на это, это ужасный способ проксирования. Вместо этого используйте вместо этого сервлет или захватите JSTL <c:import>.

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