JspWriter de Tomcat ne codant pas correctement
-
27-09-2019 - |
Question
J'ai une configuration par défaut de Tomcat 7 et tout java liés configuré pour utiliser utf-8.
Cela ne fonctionne pas (UTF-8 caractères sont mutilées):
<%@ 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);
}
%>
fait, mais enregistre 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);
}
%>
Je l'ai cherché mais n'a trouvé aucune réponse. Est-ce un bogue dans Tomcat, ou est-il quelque chose que je suis absent?
La solution
Lorsque vous construisez InputStreamReader
sans spécifier un jeu de caractères comme argument de 2e, le codage par défaut de la plate-forme sera utilisée, qui est souvent ISO-8859-1. Vous devez spécifier le même charset comme spécifié dans l'en-tête de réponse de l'URL cible, qui est UTF-8.
input = new BufferedReader(new InputStreamReader(target.openStream(), "UTF-8"));
Le IllegalStateException
est dû au fait que vous faites cela dans une JSP au lieu d'un Servlet. Le JSP utilise en interne response.getWriter()
, mais vous appelez response.getOutputStream()
dans une JSP scriptlet . Cela ne peut pas être fait en même temps comme expliqué dans leurs javadocs. En outre, la double boucle est loin d'être efficace. Il suffit d'écrire immédiatement à out
(qui est response.getWriter()
) dans la première boucle au lieu d'une certaine tampon.
Peu importe, c'est une façon terrible de mandatement. utilisez plutôt un ou Servlet grab JSTL <c:import>
à la place.
<c:import url="http://en.wikipedia.org/wiki/Main_Page" />