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?

Était-ce utile?

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" /> 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top