2008-11-20 6 views
10

Quel est le meilleur moyen de coder les chaînes d'URL de sorte qu'elles soient conformes à la norme rfc2396 et de décoder une chaîne conforme à la norme rfc2396 de sorte que% 20 soit remplacé par un espace?Encoder et décoder les URL rfc2396

modifier: cours URLEncoder et URLDecoder ne pas encoder/décoder RFC2396 URL conformes, ils encodent à un type MIME d'application/x-www-form-urlencoded qui est utilisé pour coder des données de paramètres de formulaire HTML.

+0

est-ce pas l'application/x-www-form-urlencoded la même chose? –

+0

Non, ce n'est pas le cas. L'encodage RFC2396 n'est pas le même que l'encodage pour les données de formulaire HTML. – Gili

+2

Voir http://stackoverflow.com/questions/444112/how-do-i-encode-uri-parameter-values ​​il y a peu de réponses. –

Répondre

11

Utilisez la classe URI comme suit:

URI uri = new URI("http", "//www.someurl.com/has spaces in url", null); 
URL url = uri.toURL(); 

ou si vous voulez une chaîne:

String urlString = uri.toASCIIString();
-3
+3

Cela ne fonctionnera pas.Les URLEncoder et URLDecoder sont pour coder et décoder des données de forme html malgré leurs noms. –

1

Les javadocs recommandent d'utiliser la classe java.net.URI pour effectuer le codage. Pour garantir que la classe URI code correctement l'URL, vous devez utiliser l'un des constructeurs multi-arguments. Ces constructeurs effectueront le codage requis, mais vous devrez analyser toute chaîne d'URL dans les paramètres.

Si vous voulez décoder, vous devez construire l'URI avec le constructeur à un seul argument, qui n'effectue aucun codage. Vous pouvez ensuite appeler des méthodes telles que getPath() etc. pour récupérer et générer l'URL décodée.

+0

Les constructeurs multi-arguments n'aident pas car il n'y a aucun moyen de leur dire quelle partie de votre chaîne de requête doit être codée et laquelle ne l'est pas. Nous avons besoin d'une méthode qui accepte une valeur de paramètre et renvoie le formulaire codé en URL. – Gili

+0

Toute la chaîne de requête doit potentiellement être codée en fonction de ce qu'elle peut contenir. –

2

Vos composants, contenant potentiellement des caractères qui doivent être échappés, devraient déjà avoir été échappés en utilisant URLEncoder avant d'être concaténés en URI. Si vous avez un URI avec des caractères hors bande dans (comme espace, "<> [] {} \ | ^`, et octets non-ASCII), ce n'est pas vraiment un URI. les corriger manuellement en les désactivant, mais il s'agit d'une opération de correction de dernier niveau et non d'un codage standard, ce qui est généralement nécessaire lorsque vous acceptez des URI potentiellement mal formés à partir des entrées utilisateur, mais ce n'est pas un standard. opération et je ne connais pas de fonction de bibliothèque Java intégrée qui le fera pour vous, vous devrez peut-être pirater quelque chose avec un RegExp

Dans l'autre sens, vous devez séparer votre URI dans ses parties composantes (chaque partie de chemin distincte, le nom et la valeur du paramètre de requête, etc.) avant que vous puissiez annuler l'échappement de chaque partie (à l'aide d'un URLDecoder). Il n'y a aucun moyen sensé de% -décoder un URI entier en une fois; vous pouvez essayer de 'décoder% -escapes qui ne décodent pas en délimiteurs' (comme /? = &;%) mais vous vous retrouverez avec une chaîne incohérente étrange qui n'est pas conforme à un standard de traitement d'URI. Les paramètres URLEncoder/URLDecoder conviennent à la gestion des composants de requête URI, à la fois les noms et les valeurs. Cependant, ils ne sont pas exactement pour gérer les composants de la partie du chemin de l'URI. La différence est que le caractère '+' ne signifie pas un espace dans une partie de chemin. Vous pouvez corriger cela avec une simple chaîne replace: après URLEncoding, remplacez '+' par '% 20'; avant URLDecoding, remplacez '+' par '% 2B'. Vous pouvez ignorer la différence si vous ne prévoyez pas d'inclure des segments contenant des espaces ou des plus dans votre chemin.

+1

Cela semble risqué. Il serait beaucoup plus sûr d'utiliser un encodeur conçu pour le RFC2396 que d'essayer de pirater URLEncoder en un seul. Vous pourriez faire une erreur. – Gili

Questions connexes