2011-01-30 38 views
16

En Java, que necesitan para utilizar HTTP POST para enviar la solicitud al servidor, pero si en el parámetro de la URL contiene algún carácter especial se lanza a continuación ExcepciónURL y decodificación de caracteres especiales en Java

java. lang.IllegalArgumentException: URLDecoder: Los caracteres ilegales hexagonales en de escape (%) de patrones - para cadena de entrada: "& '"

El código para enviar datos

DefaultHttpClient httpclient = new DefaultHttpClient(); 
    HttpPost httpPost = new HttpPost(URL); 

    String sessionId = RequestUtil.getRequest().getSession().getId(); 
    String data = arg.getData().toString(); 

    List<NameValuePair> params = new ArrayList<NameValuePair>(); 
    params.add(new BasicNameValuePair(param1, data)); 
    params.add(new BasicNameValuePair(param2, sessionId)); 
     httpPost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));   

    HttpResponse response = (HttpResponse) httpclient.execute(httpPost); 

Y en el lado del servidor, yo uso el código de abajo para leer la información

String data = request.getParameter(param1); 
    if (data != null) { 
    actionArg = new ChannelArg(URLDecoder.decode(data, "UTF-8")); 
    } 

El código funciona correctamente, pero si de entrada un poco de carácter especial como [a あ あ # $% & '(<>? /., あ あ あ,,), arrojará una excepción. Me pregunto si alguien podría ayudarme con alguna pista para poder codificar y decodificar personajes especiales.

Muchas gracias de antemano.

Respuesta

5

codificador Lamentablemente url no va a resolver su problema. Tuve este problema y usé una utilidad personalizada. Recuerdo esto que obtuve de Google;).

http://www.javapractices.com/topic/TopicAction.do?Id=96

+3

Supervisé mejores soluciones. Nuestros amigos de apache tienen StringEscapeUtils (org.apache.commons.lang.StringEscapeUtils). Por favor, compruebalo si funciona. –

7

para codificar el texto para el paso seguro a través de los internets:

import java.net.*; 
... 
try { 
    encodedValue= URLEncoder.encode(rawValue, "UTF-8"); 
} catch (UnsupportedEncodingException uee) { } 

Y para decodificar:

try { 
    decodedValue = URLDecoder.decode(rawValue, "UTF-8"); 
} catch (UnsupportedEncodingException uee) { } 
+0

Gracias Steven, pero como se puede ver en mi código, yo uso UrlEncodedFormEntity (params, "UTF-8") en el sitio del cliente para codificar mis datos de objeto y en el lado del servidor, utilicé URLDecoder.decode (datos, "UTF-8") para decodificar. Funcionó correctamente con caracteres japoneses, pero el problema solo surgió cuando ingresé un carácter como [# $% & '(<>? /.,] –

+0

gracias funcionó como se esperaba jejeje: D – gumuruh

3
String data = request.getParameter(param1); 

Si este es el servlet API, ya se han decodificado de los parámetros. No es necesario seguir manejando la codificación porcentual.


No he utilizado HttpClient, pero asegúrese de que está enviando la codificación en el encabezado:

Content-type: application/x-www-form-urlencoded; charset=UTF-8 

O, si es necesario, establecer la codificación conocido antes de que cualquier getParameter llamadas:

request.setCharacterEncoding("UTF-8"); 
+0

Establecer este tipo de contenido funcionó para mí. –

+0

¡Eso es oro! Muchas gracias – jiantongc

1

intento de guayaba

com.google.common.net.UrlEscapers uso

que trabaja muy bien con el chino

así:

Escaper escaper = UrlEscapers.urlFragmentEscaper(); 
String result = escaper.escape(yoururl); 
Cuestiones relacionadas