2012-06-19 25 views
10

Tengo un servlet de Java que recibe datos de un sistema en sentido ascendente a través de una solicitud HTTP GET. Esta solicitud incluye un parámetro llamado "texto". Si el sistema de aguas arriba asigna a este parámetro:servlet request parámetro codificación de caracteres

TEST3 please ignore: 

Aparece en los registros del sistema de aguas arriba como:

00 54 00 45 00 53 00 54 00 33 00 20 00 70 00 6c //TEST3 pl 
00 65 00 61 00 73 00 65 00 20 00 69 00 67 00 6e //ease ign 
00 6f 00 72 00 65 00 3a       //ore: 

(Los comentarios // no aparecen realmente en los registros)

En mi servlet leí este parámetro con:

String text = request.getParameter("text"); 

Si puedo imprimir el valor de text a la consola, aparece como:

T E S T 3 p l e a s e i g n o r e : 

Si examino el valor de text en el depurador, aparece como:

\u000T\u000E\u000S\u000T\u0003\u0000 \u000p\u000l\u000e\u000a\u000s\u000e\u0000 
\u000i\u000g\u000n\u000o\u000r\u000e\u000: 

lo que parece que hay un problema con la codificación de caracteres. Se supone que el sistema upstream usa UTF-16. Mi suposición es que el servlet está asumiendo UTF-8 y, por lo tanto, está leyendo dos veces el número de caracteres que debería ser. Para el mensaje "TEST3, ignore:" el primer byte de cada carácter es 00. Esto se interpreta como un espacio cuando el servlet lo lee, lo que explica el espacio que aparece antes de cada carácter cuando el mensaje está registrado por el servlet.

Obviamente, mi objetivo es simplemente obtener el mensaje "TEST3 ignorar:" cuando leí el parámetro de solicitud text. Creo que podría lograr esto especificando la codificación de caracteres del parámetro de solicitud, pero no sé cómo hacer esto.

+1

parámetros GET tienen que ser codificados en ASCII o URL, no se puede utilizar un conjunto de caracteres especiales en ese país. –

+0

¿Cuál es su contenedor web? ¿Cuál es tu juego de caracteres html? –

+0

[Esto] (http://stackoverflow.com/questions/3278900/httpservletrequest-setcharacterencoding-seems-to-do-nothing) podría ayudar. –

Respuesta

1

parece que fue codificado con UTF-16LE codificación (Little Endian), aquí es una clase que imprime con éxito su cadena:

import java.io.UnsupportedEncodingException; 
import java.math.BigInteger; 

public class Test { 
    public static void main(String[] args) throws UnsupportedEncodingException { 
      String hex = "00 54 00 45 00 53 00 54 00 33 00 20 00 70 00 6c" + 
          "00 65 00 61 00 73 00 65 00 20 00 69 00 67 00 6e" + 
          "00 6f 00 72 00 65 00 3a"; // + " 00"; 
      System.out.println(new String(new BigInteger(hex.replaceAll(" ", ""), 16).toByteArray(), "UTF-16LE")); 
    } 
} 

Salida:

TEST3 please ignore? 

de salida con dos cero del añadido a la entrada

TEST3 please ignore: 

ACTUALIZACIÓN

Para conseguir este trabajo con su Servlet que puede probar:

String value = request.getParameter("text"); 
    try { 
     value = new String(value.getBytes(), "UTF-16LE"); 
    } catch(java.io.UnsupportedEncodingException ex) {} 

ACTUALIZACIÓN

ver la siguiente link, se verifica que el hexágono producido es, de hecho, UTF-16LE

+0

El último carácter debe ser ':' en lugar de '?'. –

+0

@Don, eso es porque el último '00' falta en' 3a', si lo agrega extra, se decodifica correctamente, o el codificador de esa cadena está en mal estado o quizás se olvidó de copiar los últimos dos cero – epoch

+0

Correcto, probablemente un error de copiar y pegar de mi parte. Por cierto, ¿estás seguro de que esto no es un gran endian? Gracias por su ayuda –

1

Try utilizar Filtro para este

public class CustomCharacterEncodingFilter implements Filter { 

    public void init(FilterConfig config) throws ServletException { 
    } 

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
                 throws IOException, ServletException { 
     request.setCharacterEncoding("UTF-8"); 
     response.setCharacterEncoding("UTF-8"); 
     chain.doFilter(request, response); 
    } 

    public void destroy() { 
    } 

Esto debe establecer la codificación correcta para toda la aplicación

8

uso como éste

new String(req.getParameter("<my request value>").getBytes("ISO-8859-1"),"UTF-8") 
+1

esto resolvió mi problema pero no lo hago Entiendo completamente por qué ... :( – pataluc

+5

[edición oculta] busco un poco más profundo y descubro que llamar a 'request.setCharacterEncoding (" UTF-8 ");' era lo único que necesitaba (y tiene mucho más sentido) – pataluc

Cuestiones relacionadas