JSPWriter Tomcat не правильно кодирует
-
27-09-2019 - |
Вопрос
У меня есть настройка по умолчанию Tomcat 7 и все, связанное с Java, связанным с использованием UTF-8.
Это не работает (символы UTF-8 Mangled):
<%@ 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);
}
%>
Это делает, но журналы RegalAlStateExceptions:
<%@ 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, или есть что-то, чего мне не хватает?
Решение
Когда вы строите 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" />