web-dev-qa-db-fra.com

Échappement de l'esperluette dans l'URL

J'essaie d'envoyer un message GET contenant des chaînes avec des esperluettes et je ne vois pas 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 les URL manuellement, il me faut donc les bons caractères.

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

175
tomermes

Ils doivent être encodés en pourcentage:

> encodeURIComponent('&')
"%26"

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

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

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

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

L'idée est la même que 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 pourcentage d'encodage évite les problèmes d'analyse dans les deux contextes.

L'endroit où cela est le plus utile est souvent lorsque vous devez insérer une URL dans 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 ?'():/, alors j'ai codé la valeur entière du paramètre d'URL status. Cela est également utile lorsque vous utilisez les liens mailto: ayant un corps de message ou un objet, car vous devez coder les paramètres body et subject pour conserver intactes 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 "but réservé") dans un certain contexte et qu'un schéma d'URI indique qu'il est nécessaire d'utiliser ce caractère à une autre fin, le caractère doit être codé en pourcentage. Pour encoder en pourcentage un caractère réservé, il faut convertir le caractère en son octet correspondant dans ASCII, puis représenter cette valeur sous forme d'une paire de chiffres hexadécimaux. Les chiffres, précédés du signe de pourcentage ("%") 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 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 composant "path" 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 figurer dans un segment de chemin d'accès, 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

35
Alex W

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

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

6
gkalpak

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

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

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

2
Peter Hull

Si vous ne pouvez utiliser aucune bibliothèque pour encoder la valeur, http://www.urlencoder.org/ ou http://www.urlencode-urldecode.com/ ou ...

Entrez simplement votre valeur "M & M", pas l'URL complète ;-)

0
Oliver

Cela peut aider si quelqu'un le veut en PHP

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

Vous pouvez plutôt passer vos arguments en utilisant cette fonction encodeURIComponent afin de ne pas avoir à vous soucier de transmettre 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

0
nikhilmeth