JspWriter di Tomcat non codifica correttamente
-
27-09-2019 - |
Domanda
Ho una configurazione di default di Tomcat 7 e tutto relativi a Java configurato per utilizzare utf-8.
Questo non funziona (UTF-8 caratteri vengono alterati):
<%@ 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);
}
%>
Questo non fa, ma registra 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);
}
%>
Ho cercato ma non ha trovato risposte. Questo è un bug in Tomcat, o c'è qualcosa che mi manca?
Soluzione
Quando si costruisce InputStreamReader
senza specificare un set di caratteri come 2 ° argomento, quindi la codifica predefinita piattaforma sarà utilizzata, che spesso è ISO-8859-1. È necessario specificare lo stesso set di caratteri, come specificato nell'intestazione della risposta del URL di destinazione, che è UTF-8.
input = new BufferedReader(new InputStreamReader(target.openStream(), "UTF-8"));
Il IllegalStateException
è causato perché si sta facendo questo in una JSP invece di una Servlet. JSP utilizza internamente response.getWriter()
, ma si sta chiamando response.getOutputStream()
in una JSP scriptlet . Questo non può essere fatto contemporaneamente come spiegato nelle loro javadocs. Inoltre, il doppio anello è tutt'altro che efficiente. Basta scrivere immediatamente out
(che è response.getWriter()
) nel primo ciclo anziché a qualche tampone.
Indipendentemente da ciò, questo è un modo terribile di proxy. Piuttosto usare una servlet o afferrare JSTL <c:import>
invece.
<c:import url="http://en.wikipedia.org/wiki/Main_Page" />