web-dev-qa-db-fra.com

Encoder et décoder l'URL Caractère spécial dans Java

En Java, je dois utiliser HTTP Post pour envoyer une demande au serveur, mais si dans le paramètre de l'URL contient un caractère spécial, il renvoie ci-dessous Exception

Java.lang.IllegalArgumentException: URLDecoder: caractères hexadécimaux illégaux dans le modèle d'échappement (%) - Pour la chaîne d'entrée: "& '"

Le code pour envoyer des données

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);

Et côté serveur, j'utilise le code ci-dessous pour lire les informations

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

Le code fonctionne correctement mais si j'entre un caractère spécial tel que [a あ あ # $% & '(<>? /., あ あ あ あ あ], il lèvera une exception. Je me demande si quelqu'un pourrait m'aider à obtenir un indice pour pouvoir encoder et décoder des caractères spéciaux?

Merci beaucoup d'avance.

17
Phu Nguyen

Malheureusement, l'encodeur d'URL ne résoudra pas votre problème. J'ai eu ce problème et j'ai utilisé un utilitaire personnalisé. Je me souviens de ce que j'ai obtenu sur Google;).

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

6
uncaught_exceptions

Pour encoder du texte pour un passage sûr à travers les internets:

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

Et pour décoder:

try {
    decodedValue = URLDecoder.decode(rawValue, "UTF-8");
} catch (UnsupportedEncodingException uee) { }
10
Steven
String data = request.getParameter(param1);

S'il s'agit de servlet API , les paramètres ont déjà été décodés. Aucune autre manipulation du codage en pourcentage n'est nécessaire.


Je n'ai pas utilisé HttpClient, mais assurez-vous qu'il envoie le codage dans l'en-tête:

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

Ou, si vous le devez, définissez le codage connu avant tout appel à getParameter:

request.setCharacterEncoding("UTF-8");
4
McDowell

essayez la goyave

utilisez com.google.common.net.UrlEscapers

ça marche bien avec le chinois

comme ça:

Escaper escaper = UrlEscapers.urlFragmentEscaper();
String result = escaper.escape(yoururl);
2
chrisssss