Lors du codage d'une chaîne de requête à envoyer à un serveur Web - quand utilisez-vous escape()
et quand utilisez-vous encodeURI()
ou encodeURIComponent()
:
Utilisez escape:
escape("% +&=");
OU
utilisez encodeURI () / encodeURIComponent ()
encodeURI("http://www.google.com?var1=value1&var2=value2");
encodeURIComponent("var1=value1&var2=value2");
encodeURIComponent("var1=value1&var2=value2")
n'est pas le cas d'utilisation typique. Cet exemple encodera le=
et&
, ce qui n'est probablement pas ce qui était prévu!encodeURIComponent
est généralement appliqué séparément à la seule valeur de chaque paire de valeurs clés (la partie après chaque=
).var params = encodeURIComponent(key) + '=' + encodeURIComponent(value);
- Peut-être que quelqu'un d'autre connaît mieux.Réponses:
échapper()
Ne l'utilisez pas!
escape()
est défini dans la section B.2.1.2 escape et le texte d'introduction de l'annexe B dit:Comportement:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/escape
Les caractères spéciaux sont codés à l'exception de: @ * _ + -. /
La forme hexadécimale de caractères, dont la valeur unitaire du code est 0xFF ou moins, est une séquence d'échappement à deux chiffres:
%xx
.Pour les caractères avec une unité de code plus grande, le format à quatre chiffres
%uxxxx
est utilisé. Ceci n'est pas autorisé dans une chaîne de requête (comme défini dans RFC3986 ):Un signe de pourcentage n'est autorisé que s'il est directement suivi de deux chiffres hexadécimaux, le pourcentage suivi de
u
n'est pas autorisé.encodeURI ()
Utilisez encodeURI lorsque vous voulez une URL de travail. Faites cet appel:
obtenir:
N'appelez pas encodeURIComponent car cela détruirait l'URL et retournerait
encodeURIComponent ()
Utilisez encodeURIComponent lorsque vous souhaitez coder la valeur d'un paramètre d'URL.
Ensuite, vous pouvez créer l'URL dont vous avez besoin:
Et vous obtiendrez cette URL complète:
http://example.net/?param1=http%3A%2F%2Fexample.org%2F%Ffa%3D12%26b%3D55¶m2=99
Notez que encodeURIComponent n'échappe pas au
'
caractère. Un bogue courant consiste à l'utiliser pour créer des attributs html tels quehref='MyUrl'
, qui pourraient subir un bogue d'injection. Si vous construisez du code HTML à partir de chaînes, utilisez"
au lieu de'
pour les guillemets d'attributs ou ajoutez une couche d'encodage supplémentaire ('
peut être encodé en tant que% 27).Pour plus d'informations sur ce type d'encodage, vous pouvez consulter: http://en.wikipedia.org/wiki/Percent-encoding
la source
'
par'
) avant d'être placés dans un document HTML.La différence entre
encodeURI()
etencodeURIComponent()
est exactement de 11 caractères encodés par encodeURIComponent mais pas par encodeURI:J'ai généré ce tableau facilement avec console.table dans Google Chrome avec ce code:
la source
var arr=[]; for(var i=0;i<256;i++){var char=String.fromCharCode(i); if(encodeURI(char)!==encodeURIComponent(char)) console.log("character: "+char + " | encodeURI: " +encodeURI(char) + " |encodeURIComponent: " + encodeURIComponent(char) ) }
J'ai trouvé cet article instructif: Javascript Madness: Query String Parsing
Je l'ai trouvé lorsque j'essayais de comprendre pourquoi decodeURIComponent ne décodait pas correctement «+». En voici un extrait:
la source
encodeURI
semble que cela n'est utile que dans un cas de bord assez obscur et n'a vraiment pas besoin d'exister. J'ai des divergences d'opinion avec lui, mais je n'y vois absolument rien de faux ou d'idiot. Que pensez-vous exactement est un non-sens?enctype
attribut de l'FORM
élément spécifie le type de contenu utilisé pour coder l'ensemble de données de formulaire à soumettre au serveur. application / x-www-form-urlencoded Il s'agit du type de contenu par défaut. Les formulaires soumis avec ce type de contenu doivent être codés comme suit: [...] Les caractères d'espace sont remplacés par `` + '', et [...] Les caractères non alphanumériques sont remplacés par `% HH ', [...] Ref: HTML4 SepcencodeURIComponent n'encode pas
-_.!~*'()
, ce qui provoque un problème de publication des données sur php dans la chaîne xml.Par exemple:
<xml><text x="100" y="150" value="It's a value with single quote" /> </xml>
Évasion générale avec
encodeURI
%3Cxml%3E%3Ctext%20x=%22100%22%20y=%22150%22%20value=%22It's%20a%20value%20with%20single%20quote%22%20/%3E%20%3C/xml%3E
Vous voyez, les guillemets simples ne sont pas encodés. Pour résoudre le problème, j'ai créé deux fonctions pour résoudre le problème dans mon projet, pour Encoding URL:
Pour décoder l'URL:
la source
encodeURI () - la fonction escape () est pour l'échappement javascript, pas HTTP.
la source
var url = "http://kuler-api.adobe.com/rss/get.cfm?startIndex=0&itemsPerPage=20&timeSpan=0&listType=rating"
... Et je veux y accéder via l'API Google Ajax, comme ceci:var gurl = "http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&callback=?&q=" + url;
... alors je dois utiliserescape(url)
.encodeURI(url)
ne fonctionne pas avec des paramètres comme il semble.Petit tableau de comparaison Java vs JavaScript vs PHP.
la source
Je recommande de ne pas utiliser l'une de ces méthodes telles quelles. Écrivez votre propre fonction qui fait la bonne chose.
MDN a donné un bon exemple sur le codage d'URL ci-dessous.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent
la source
N'oubliez pas non plus qu'ils encodent tous différents ensembles de caractères et sélectionnez celui dont vous avez besoin de manière appropriée. encodeURI () encode moins de caractères que encodeURIComponent (), qui encode moins de caractères (et aussi différents, au point de Dannyp) que escape ().
la source
Aux fins de l'encodage javascript a donné trois fonctions intégrées -
escape()
- n'encode pas@*/+
Cette méthode est déconseillée après l'ECMA 3, elle doit donc être évitée.encodeURI()
- n'encode pas~!@#$&*()=:/,;?+'
Il suppose que l'URI est un URI complet, donc n'encode pas les caractères réservés qui ont une signification spéciale dans l'URI. Cette méthode est utilisée lorsque l'intention est de convertir l'URL complète au lieu d'un segment spécial d'URL. Exemple -encodeURI('http://stackoverflow.com');
donnera - http://stackoverflow.comencodeURIComponent()
- ne pas coder- _ . ! ~ * ' ( )
Cette fonction code un composant URI (Uniform Resource Identifier) en remplaçant chaque instance de certains caractères par une, deux, trois ou quatre séquences d'échappement représentant le codage UTF-8 du caractère. Cette méthode doit être utilisée pour convertir un composant d'URL. Par exemple, certaines entrées utilisateur doivent être ajoutées Exemple -encodeURIComponent('http://stackoverflow.com');
donnera - http% 3A% 2F% 2Fstackoverflow.comTout cet encodage est effectué en UTF 8 c'est-à-dire que les caractères seront convertis au format UTF-8.
encodeURIComponent diffère de encodeURI en ce qu'il encode les caractères réservés et le numéro de signe # d'encodeURI
la source
J'ai trouvé qu'expérimenter avec les différentes méthodes est une bonne vérification de la santé mentale même après avoir une bonne idée de leurs différentes utilisations et capacités.
À cette fin, j'ai trouvé ce site Web extrêmement utile pour confirmer mes soupçons que je fais quelque chose de manière appropriée. Il s'est également avéré utile pour décoder une chaîne encodéeURIComponent'ed qui peut être assez difficile à interpréter. Un excellent marque-page pour avoir:
http://www.the-art-of-web.com/javascript/escape/
la source
La réponse acceptée est bonne. Pour étendre sur la dernière partie:
Si vous voulez être du bon côté, le pourcentage d'encodage des caractères non réservés doit également être encodé.
Vous pouvez utiliser cette méthode pour leur échapper (source Mozilla )
la source
Réécriture moderne de la réponse de @ johann-echavarria:
Ou si vous pouvez utiliser un tableau, remplacez-le
console.log
parconsole.table
(pour une sortie plus jolie).la source
Inspiré par la table de Johann , j'ai décidé d'étendre la table. Je voulais voir quels caractères ASCII étaient encodés.
Afficher l'extrait de code
Le tableau affiche uniquement les caractères codés. Les cellules vides signifient que l'original et les caractères codés sont identiques.
Juste pour être encore plus, j'ajoute une autre table pour
urlencode()
vsrawurlencode()
. La seule différence semble être l'encodage du caractère spatial.la source
J'ai cette fonction ...
la source
encodeURI
n'existe pas maisescape
existe.