218 votes

URLEncoder ne parvient pas à traduire le caractère espace

Je m'attends à ce que

System.out.println(java.net.URLEncoder.encode("Hello World", "UTF-8"));

à la sortie :

Hello%20World

(20 est le code ASCII Hex pour l'espace)

Cependant, ce que je reçois est :

Hello+World

Est-ce que j'utilise la mauvaise méthode ? Quelle est la méthode correcte que je devrais utiliser ?

3 votes

Le nom de la classe est en effet déroutant, et beaucoup de gens l'ont utilisé à tort. Cependant, ils ne le remarquent pas, car lorsque URLDecoder est appliqué, la valeur originale est restaurée, donc + ou %20 n'a pas vraiment d'importance pour eux.

6voto

Chrispix Points 4867

Je viens de me battre avec cela aussi sur Android, j'ai réussi à tomber sur Uri.encode(String, String) bien que spécifique à Android (Android.net.Uri) pourrait être utile à certains.

statique String encode(String s, String allow)

https://developer.Android.com/reference/Android/net/Uri.html#encode(java.lang.String, java.lang.String)

6voto

Plantface Points 863

Les autres réponses présentent soit un remplacement manuel des cordes, URLEncoder qui encode en fait pour le format HTML, l'algorithme d'Apache abandonné URIUtil ou en utilisant l'outil de Guava UrlEscapers . Le dernier est bien, sauf qu'il ne fournit pas de décodeur.

Apache Commons Lang fournit le URLCodec qui code et décode selon le format de l'URL rfc3986 .

String encoded = new URLCodec().encode(str);
String decoded = new URLCodec().decode(str);

Si vous utilisez déjà Spring, vous pouvez également choisir d'utiliser son UriUtils également.

3voto

gourab ghosh Points 124

Si vous utilisez Jetty, alors org.eclipse.jetty.util.URIUtil résoudra le problème.

String encoded_string = URIUtil.encodePath(not_encoded_string).toString();

2voto

Hitesh Kumar Points 432

Cela a fonctionné pour moi

org.apache.catalina.util.URLEncoder ul = new org.apache.catalina.util.URLEncoder().encode("MY URL");

2voto

Daniel Points 13823

"+" est correct. Si vous avez vraiment besoin de %20, remplacez vous-même les "+" par la suite.

Attention : Cette réponse est très contestée (+8 contre -6), alors prenez-la avec des pincettes.

7 votes

Il peut y avoir un problème si la chaîne initiale contenait réellement un caractère +.

19 votes

@Traroth - Pas vraiment. A + dans le texte original est censé être encodé en tant que %2B .

0 votes

En disant que + est correcte sans connaître le contexte est, au moins, pédant. Dévalorisé. Lisez les autres réponses pour savoir quand utiliser + ou %20.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X