URLEncoder
est la voie à suivre. Vous devez simplement vous rappeler d'encoder seulement le nom du paramètre de requête individuel et/ou sa valeur, pas l'URL entière, certainement pas le caractère séparateur des paramètres de requête &
ni le caractère séparateur du nom de paramètre-valeur =
.
String q = "random word £500 bank $";
String url = "https://example.com?q=" + URLEncoder.encode(q, StandardCharsets.UTF_8);
Si vous n'êtes toujours pas sur Java 10 ou plus récent, alors utilisez StandardCharsets.UTF_8.toString()
comme argument de jeu de caractères, ou si vous n'êtes toujours pas sur Java 7 ou plus récent, alors utilisez "UTF-8"
.
Remarquez que les espaces dans les paramètres de requête sont représentés par +
, pas par %20
, ce qui est parfaitement valide. Le %20
est généralement utilisé pour représenter les espaces dans l'URI lui-même (la partie avant le caractère séparateur de chaîne de requête d'URI ?
), pas dans la chaîne de requête (la partie après ?
).
Remarquez également qu'il y a trois méthodes encode()
. Une sans Charset
en tant que deuxième argument et une autre avec String
comme deuxième argument qui lance une exception vérifiée. Celle sans argument Charset
est obsolète. Ne l'utilisez jamais et spécifiez toujours l'argument Charset
. Même la javadoc recommande explicitement d'utiliser l'encodage UTF-8, tel que prescrit par RFC3986 et W3C.
Tous les autres caractères sont considérés comme non sécurisés et sont d'abord convertis en un ou plusieurs octets en utilisant un certain schéma d'encodage. Ensuite, chaque octet est représenté par la chaîne de 3 caractères "%xy", où xy est la représentation hexadécimale à deux chiffres de l'octet. Le schéma d'encodage recommandé à utiliser est UTF-8. Cependant, pour des raisons de compatibilité, si un codage n'est pas spécifié, alors le codage par défaut de la plate-forme est utilisé.
Voir aussi :
30 votes
Que voulez-vous dire par "aucun d'eux ne sort bien" ?
2 votes
J'ai utilisé URI.create et j'ai remplacé les espaces par + dans la chaîne de requête. Sur le site du client, les + ont été convertis en espaces lorsque j'ai sélectionné les chaînes de requête. Cela a fonctionné pour moi.
1 votes
Possible duplicate de Existe-t-il une méthode Java qui encode une collection de paramètres en tant que composant de requête d'URL ?
1 votes
Pourquoi vous attendez-vous à ce que $ soit encodé en pourcentage?