281 votes

Echappement de l'esperluette dans l'URL

J'essaie d'envoyer un message GET qui contient des chaînes avec des esperluettes et je n'arrive pas à trouver comment échapper à l'esperluette dans l'URL.

Ejemplo:

http://www.example.com?candy_name=M&M
result => candy_name = M

J'ai aussi essayé :

http://www.example.com?candy_name=M\&M
result => candy_name = M\\

J'utilise les URLs manuellement, j'ai donc juste besoin des caractères corrects.

Je ne peux utiliser aucune bibliothèque. Comment faire ?

477voto

Blender Points 114729

Ils doivent être codés en pourcentage :

> encodeURIComponent('&')
"%26"

Donc, dans votre cas, l'URL ressemblerait à ceci :

http://www.mysite.com?candy_name=M%26M

9 votes

:- %26 ne fonctionne pas pour moi. Existe-t-il une autre solution ?

4 votes

Lorsque je remplace & par %26, il affiche toujours la même erreur A potentially dangerous Request.Path value was detected from the client (&).

8 votes

@Sanjiv : C'est un problème avec votre code, pas avec l'encodage en pourcentage. Posez une question.

48voto

Alex W Points 11502

Cela ne seulement appliquer à l'esperluette dans les URLs, mais à toutes les caractères réservés . En voici quelques-unes :

 # $ & + ,  / : ; = ? @ [ ]

L'idée est la même que celle de coder un & dans un document HTML, mais le contexte a changé pour être dans l'URI, en plus d'être dans le document HTML. Ainsi, le codage en pourcentage évite les problèmes d'analyse syntaxique dans les deux contextes.

Cette fonction s'avère très utile lorsque vous devez placer une URL à l'intérieur d'une autre URL. Par exemple, si vous voulez publier un statut sur Twitter :

http://www.twitter.com/intent/tweet?status=What%27s%20up%2C%20StackOverflow%3F(http%3A%2F%2Fwww.stackoverflow.com)

Il y a beaucoup de caractères réservés dans mon Tweet, à savoir ?'():/ donc j'ai encodé la valeur entière de l'élément status Paramètre URL. Ceci est également utile lorsque vous utilisez mailto: qui ont un corps de message ou un sujet, parce que vous devez coder les body y subject pour que les sauts de ligne, les esperluettes, etc. restent intacts.

Lorsqu'un caractère du jeu réservé (un "caractère réservé") a une signification spéciale (un "but réservé") dans un certain contexte, et qu'un schéma URI indique qu'il est nécessaire d'utiliser ce caractère dans un autre but, alors le caractère réservé est utilisé. le caractère doit être codé en pourcentage. Codage en pourcentage d'un caractère réservé consiste à convertir le caractère en sa valeur d'octet correspondante en ASCII. valeur d'octet correspondante en ASCII, puis de représenter cette valeur sous la forme d'une paire de chiffres hexadécimaux. une paire de chiffres hexadécimaux. Ces chiffres, précédés du signe de pourcentage ("%"), qui est utilisé comme caractère d'échappement, sont ensuite utilisés dans l'URI à la place du caractère réservé. (Pour un caractère non ASCII, il est généralement généralement converti en sa séquence d'octets en UTF-8, puis chaque valeur d'octet est représentée comme ci-dessus). est représentée comme ci-dessus). Le caractère réservé "/", par par exemple, s'il est utilisé dans le composant "path" d'une URI, a la d'être un délimiteur entre les segments de chemin. Si, selon un schéma schéma URI donné, "/" doit figurer dans un segment de chemin d'accès, alors les trois caractères caractères "%2F" ou "%2f" doivent être utilisés dans le segment au lieu d'un "/" brut. "/".

http://en.wikipedia.org/wiki/Percent-encoding#Percent-encoding_reserved_characters

5 votes

Parmi la liste ci-dessus, ! ' ( ) * ne sont pas codés par URL en utilisant encodeURIComponent .

0 votes

Il existe une fonction php urlencode qui résout ce problème : utilisation $escapedfilename=urlencode($filename) ;

10voto

Antonio Points 139

Je voudrais ajouter un petit commentaire sur la solution Blender.

Vous pouvez procéder comme suit :

var link = 'http://example.com?candy_name=' + encodeURIComponent('M&M');

Ces sorties :

http://example.com?candy_name=M%26M

Ce qui est génial, c'est que cela ne fonctionne pas seulement pour & mais pour tout personnage particulier.

Par exemple :

var link = 'http://example.com?candy_name=' + encodeURIComponent('M&M?><')

Sorties :

"http://example.com?candy_name=M%26M%3F%3E%3C"

8voto

ExpertSystem Points 21617

Essayez d'utiliser http://www.example.org?candy_name=M%26M .

Voir aussi cette référence et quelques informations supplémentaires sur Wikipédia .

6voto

Peter Hull Points 1270

Vous pouvez utiliser le caractère % pour "échapper" aux caractères qui ne sont pas autorisés dans les URL. Voir [RFC 1738].

Un tableau des valeurs ASCII sur http://www.asciitable.com/ .

Vous pouvez voir & est 26 en hexadécimal - donc vous avez besoin de M%26M.

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