Échapper à l'esperluette dans l'URL

203

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

Exemple:

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 des URL manuellement, j'ai donc juste besoin des bons caractères.

Je ne peux utiliser aucune bibliothèque. Comment ceci peut être fait?

tomermes
la source

Réponses:

350

Ils doivent être codés en pourcentage:

> encodeURIComponent('&')
"%26"

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

http://www.mysite.com?candy_name=M%26M
Mixeur
la source
2
: -% 26 ne fonctionne pas pour moi. N 'y a-t-il pas une autre solution.?
Sanjiv
2
Quand je remplace & à% 26, son affiche toujours la même erreurA potentially dangerous Request.Path value was detected from the client (&).
Sanjiv
4
@Sanjiv: C'est un problème avec votre code, pas avec un encodage en pourcentage. Poser une question.
Blender
2
@Sanjiv assurez-vous de remplacer "&" par "% 26" en premier. Voir le code ::: NSString * message = @ "Hello Jack & Jill"; message = [message stringByReplacingOccurrencesOfString: @ "&" withString: @ "% 26"]; message = [message stringByAppendingString: @ ""]; message = [message stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
Nirav
40

Cela ne s'applique pas seulement à l'esperluette dans les URL, mais à tous les caractères réservés . Certains comprennent:

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

L'idée est la même que l'encodage d'un &dans un document HTML, mais le contexte a changé pour être dans l'URI, en plus d'être dans le document HTML. Ainsi, l'encodage en pourcentage empêche les problèmes d'analyse syntaxique à l'intérieur des deux contextes.

L'endroit où cela est très utile est lorsque vous devez mettre une URL à l'intérieur d'une autre URL. Par exemple, si vous souhaitez 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 ?'():/, j'ai donc encodé toute la valeur du statusparamètre URL. Cela est également utile lorsque vous utilisez des mailto:liens qui ont un corps ou un objet de message, car vous devez coder les paramètres bodyet subjectpour conserver les sauts de ligne, les esperluettes, etc.

Lorsqu'un caractère de l'ensemble réservé (un "caractère réservé") a une signification spéciale (un "objectif réservé") dans un certain contexte, et qu'un schéma d'URI indique qu'il est nécessaire d'utiliser ce caractère à d'autres fins, alors le caractère doit être codé en pourcentage. L'encodage en pourcentage d'un caractère réservé implique de convertir le caractère en sa valeur d'octet correspondante en ASCII, puis de représenter cette valeur sous la forme d'une paire de chiffres hexadécimaux. Les chiffres, précédés d'un 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 converti en sa séquence d'octets en UTF-8, puis chaque valeur d'octet est représentée comme ci-dessus.) Le caractère réservé "/", par exemple, s'il est utilisé dans le "chemin" composant d'un URI, a la signification particulière d'être un délimiteur entre les segments de chemin. Si, selon un schéma d'URI donné, "/" doit être dans un segment de chemin, alors les trois 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

Alex W
la source
4
Parmi la liste ci-dessus, ! ' ( ) *ne sont pas codés URL en utilisant encodeURIComponent.
Amil Waduwawara
il existe une fonction php urlencode qui résout ce problème: usage $ escapedfilename = urlencode ($ filename);
Jeremy Young
3

Vous pouvez utiliser le caractère% pour «échapper» les 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 - vous avez donc besoin de M% 26M.

Peter Hull
la source
2

Cela peut aider si quelqu'un le veut en PHP

$variable ="candy_name=M&M";
$variable = str_replace("&", "%26", $variable);
Mohamed Ramadan
la source
1

Je voudrais ajouter un commentaire mineur sur la solution Blender.

Vous pouvez effectuer les opérations suivantes:

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

Cela génère:

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

La grande chose à ce sujet, cela ne fonctionne pas seulement pour & mais pour tout personnage spécial.

Par exemple:

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

Les sorties:

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

Vous pouvez plutôt passer vos arguments en utilisant cette fonction encodeURIComponent afin de ne pas avoir à vous soucier de passer des caractères spéciaux.

data: "param1=getAccNos&param2="+encodeURIComponent('Dolce & Gabbana') OR
var someValue = 'Dolce & Gabbana';
data : "param1=getAccNos&param2="+encodeURIComponent(someValue)

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent

nikhilmeth
la source