2011-05-25 12 views
5

Tengo un problema con la descodificación de una cadena UTF-8 en Java que está codificada con Javascript o Actionscript 3. Tengo establecer un caso de prueba de la siguiente manera:Diferencia en URL decodificar/codificar UTF-8 entre Java y JS/AS3 (¿error??)

la cadena en cuestión es Produktgröße

Cuando puedo codificar con JS/AS3 consigo la siguiente cadena:

escape('Produktgröße') 

Produktgr% F6% DFE

Cuando unescape esto con JS consigo ningún cambio

unescape('Produktgr%F6%DFe') 

Produktgr% F6% DFE

Así, por esta Asumo que JS no es codificar la cadena correctamente ??

La siguiente JSP produce este outupt

<%@page import="java.net.URLEncoder"%> 
<%@page import="java.net.URLDecoder"%> 
<%=(URLDecoder.decode("Produktgr%F6%DFe","UTF-8"))%><br/> 
<%=(URLEncoder.encode("Produktgröße","UTF-8"))%><br/> 
<%=(URLEncoder.encode("Produktgröße"))%><br/> 
<%=(URLDecoder.decode(URLEncoder.encode("Produktgröße")))%><br/> 
<%=(URLDecoder.decode(URLEncoder.encode("Produktgröße"),"UTF-8"))%><br/> 

Produktgr? E

Produktgr% C3% B6% C3% 9Fe

Produktgr% C3% B6% C3% 9Fe

Produktgröße

Produktgröße

¿Alguna idea de por qué estoy teniendo esta disparidad con los idiomas y por qué JS/AS3 no se está comportando como esperaba?

Gracias.

Respuesta

10

escape es una función obsoleta y no codifica correctamente los caracteres Unicode. Use encodeURI o encodeURIComponent, este último probablemente sea el método más adecuado para sus necesidades.

+0

Gracias, esto es la respuesta que estaba buscando! – user710437

1

Javascript es URL que codifica su cadena usando Latin-1 juego de caracteres. Java es una URL que lo codifica usando UTF-8.

La codificación de URL realmente está reemplazando los caracteres/bytes que no reconoce. Por ejemplo, incluso si tuviera que quedarse con caracteres ASCII, ( se codificaría como %28. Tiene el problema adicional de los juegos de caracteres cuando comienza a usar caracteres que no son ASCII (cualquier cosa que tenga más de 7 bits).

1

he estado luchando con este problema durante horas y horas ... Mi problema era una llamada jQuery Ajax como:

return $.ajax({ 
     url: '/author!getAuthorContent.action', 
     type: 'GET', 
     data : {author:name, 'content_type': ct || 'all', 'start': start || 0} 
    }); 

'nombre' es una cadena que contiene caracteres especiales como Jérôme-Serrano

Por alguna razón, la forma en que JS/JQuery codificaba este tipo de caracteres especiales era incompatible y no pude decodificarla en Java BackEnd ...

La solución fue:

  • Codificar en el lado JS usando var econded = encodeURIComponent(name);
  • decodificarlos en el lado de Java utilizando String decoded = java.net.URLDecoder.decode(econded ,"UTF-8");

algunos refetences: http://www.programering.com/a/MjN2ADOwATg.html http://www.theerrormessage.com/2013/10/weird-characters-transmitted-to-and-from-server-through-jquery-ajax-call/

Cuestiones relacionadas