je m'attends à
System.out.println(java.net.URLEncoder.encode("Hello World", "UTF-8"));
pour sortir:
Hello%20World
(20 est le code hexadécimal ASCII pour l'espace)
Cependant, ce que j'obtiens est:
Hello+World
Est-ce que j'utilise la mauvaise méthode? Quelle est la bonne méthode que je devrais utiliser?
Réponses:
Cela se comporte comme prévu. Le
URLEncoder
implémente les spécifications HTML pour savoir comment encoder les URL dans les formulaires HTML.Depuis les javadocs :
et à partir de la spécification HTML :
Vous devrez le remplacer, par exemple:
la source
t.println(java.net.URLEncoder.encode("Hello World", "UTF-8").replace("\\+", "%20"));
Un espace est encodé
%20
dans les URL et+
dans les formulaires soumis aux données (type de contenu application / x-www-form-urlencoded). Vous avez besoin du premier.Utilisation de la goyave :
Vous pouvez utiliser UrlEscapers :
N'utilisez pas String.replace, cela coderait uniquement l'espace. Utilisez plutôt une bibliothèque.
la source
Cette classe effectue un
application/x-www-form-urlencoded
codage de type plutôt qu'un codage en pourcentage, donc le remplacementpar
+
est un comportement correct.De javadoc:
la source
url
, l'espace doit être interprété comme%20
. Alors nous devons faireurl.replaceAll("\\+", "%20")
? Et si c'est du javascript, nous ne devrions pas utiliser deescape
fonction. UtilisezencodeURI
ou à laencodeURIComponent
place. C'est ce que je pensais.Encoder les paramètres de requête
OU si vous voulez échapper des caractères dans l'URI
la source
org.apache.commons.httpclient.util.URIUtil
semble être le moyen le plus efficace de résoudre le problème!Hello+World
est la façon dont un navigateur encodera les données de formulaire (application/x-www-form-urlencoded
) pour uneGET
requête et c'est la forme généralement acceptée pour la partie requête d'un URI.Si vous envoyez cette demande à un servlet Java, le servlet décode correctement la valeur du paramètre. Habituellement, le seul moment où il y a des problèmes ici est si l'encodage ne correspond pas.
À proprement parler, il n'y a aucune exigence dans les spécifications HTTP ou URI que la partie requête soit encodée à l'aide de
application/x-www-form-urlencoded
paires clé-valeur; la partie requête doit simplement être sous la forme acceptée par le serveur Web. En pratique, il est peu probable que ce soit un problème.Il serait généralement incorrect d'utiliser ce codage pour d'autres parties de l'URI (le chemin par exemple). Dans ce cas, vous devez utiliser le schéma de codage décrit dans la RFC 3986 .
Plus ici .
la source
Les autres réponses présentent soit un remplacement manuel de chaîne, URLEncoder qui encode réellement pour le format HTML, URIUtil abandonné d' Apache , soit en utilisant UrlEscapers de Guava . Le dernier est bien, sauf qu'il ne fournit pas de décodeur.
Apache Commons Lang fournit l' URLCodec , qui encode et décode selon le format d'URL rfc3986 .
Si vous utilisez déjà Spring, vous pouvez également choisir d'utiliser sa classe UriUtils .
la source
Je viens de lutter avec cela aussi sur Android, j'ai réussi à tomber sur Uri.encode (String, String) alors que spécifique à Android (android.net.Uri) pourrait être utile à certains.
encodage de chaîne statique (chaîne s, chaîne autorisée)
https://developer.android.com/reference/android/net/Uri.html#encode(java.lang.String, java.lang.String)
la source
"+" est correct. Si vous avez vraiment besoin de% 20, remplacez les plus vous-même par la suite.
la source
+
caractère du texte original est censé être codé comme%2B
.+
c'est correct sans connaître le contexte est, au moins, pédant. Voté contre. Lisez les autres réponses pour savoir quand + ou% 20 doivent être utilisés.Cela a fonctionné pour moi
la source
Bien qu'assez vieux, néanmoins une réponse rapide:
Spring fournit UriUtils - avec cela, vous pouvez spécifier comment encoder et quelle partie est-elle liée à partir d'un URI, par exemple
Je les utilise car nous utilisons déjà Spring, c'est à dire qu'aucune bibliothèque supplémentaire n'est requise!
la source
Consultez la classe java.net.URI.
la source
Oui, cette méthode java.net.URLEncoder.encode n'a pas été conçue pour convertir "" en "20%" selon les spécifications ( source ).
Même ce n'est pas la bonne méthode, vous pouvez modifier ceci pour: passez
System.out.println(java.net.URLEncoder.encode("Hello World", "UTF-8").replaceAll("\\+", "%20"));
une bonne journée =).la source
URLEncoder.encode
) et de la corriger en utilisantreplaceAll
ce qui ne fonctionnerait que dans ce cas précis. Utilisez plutôt la classe et la méthode appropriées, voir d'autres réponses.UTILISEZ MyUrlEncode.URLencoding (String url, String enc) pour gérer le problème
la source
utiliser le jeu de caractères "
ISO-8859-1
" pour URLEncoderla source