Quand es-tu supposé utiliser escape au lieu d'encodeURI / encodeURIComponent?

lors de l'encodage d'une chaîne de requête à envoyer à un serveur web - quand utilisez-vous escape() et quand utilisez-vous encodeURI() ou encodeURIComponent() :

Utilisation échapper:

escape("% +&=");

ou

use encodeURI () / encodeURIComponent ()

encodeURI("http://www.google.com?var1=value1&var2=value2");

encodeURIComponent("var1=value1&var2=value2");
1303
demandé sur Braiam 2008-09-16 23:24:34

13 réponses

escape ()

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:

... Toutes les caractéristiques linguistiques et tous les comportements spécifiés dans la présente annexe ont une ou plusieurs caractéristiques indésirables et, en l'absence d'usage antérieur, seraient retirés de cette spécification. ...

... Les programmeurs ne devraient pas utiliser ou présumer l'existence de ces caractéristiques et comportements lorsqu'ils écrivent un nouveau code ECMAScript....

comportement:

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

Les caractères spéciaux

sont encodés à l'exception de: @*_+-./

la forme hexadécimale pour les caractères, dont l'Unité de code la valeur est 0xFF ou moins, est une séquence d'échappement à deux chiffres: %xx .

pour les caractères ayant 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 ):

query       = *( pchar / "/" / "?" )
pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded   = "%" HEXDIG HEXDIG
sub-delims    = "!" / "$" / "&" / "'" / "(" / ")"
              / "*" / "+" / "," / ";" / "="

un signe pour cent n'est autorisé que s'il est directement suivi de deux hexdigits, le signe pour cent suivi de u n'est pas autorisé.

encodeURI()

utilisez encodeURI quand vous voulez une URL qui fonctionne. Faites cet appel:

encodeURI("http://www.example.org/a file with spaces.html")

pour obtenir:

http://www.example.org/a%20file%20with%20spaces.html

N'appelez pas encodeURIComponent car cela détruirait L'URL et le retour

http%3A%2F%2Fwww.example.org%2Fa%20file%20with%20spaces.html

encodeURIComponent ()

utilisez encodeURIComponent lorsque vous voulez encoder la valeur d'un paramètre D'URL.

var p1 = encodeURIComponent("http://example.org/?a=12&b=55")

alors vous pouvez créer l'URL vous avez besoin de:

var url = "http://example.net/?param1=" + p1 + "&param2=99";

et vous obtiendrez cette URL complète:

http://example.net/?param1=http%3A%2F%2Fexample.org%2F%Ffa%3D12%26b%3D55&param2=99

notez que le composant encodeuric n'échappe pas au caractère ' . Un bug courant est de l'utiliser pour créer des attributs html tels que href='MyUrl' , qui pourraient souffrir d'un bug d'injection. Si vous construisez html à partir de chaînes de caractères, Utilisez " au lieu de ' pour les citations d'attributs, ou ajoutez une couche supplémentaire de encodage ( ' peut être encodé comme %27).

pour plus d'informations sur ce type d'encodage, vous pouvez consulter: http://en.wikipedia.org/wiki/Percent-encoding

1828
répondu Arne Evertsson 2018-08-06 06:36:54

la différence entre encodeURI() et encodeURIComponent() sont exactement 11 caractères encodés par encodeURIComponent mais pas par encodeURI:

Table with the ten differences between encodeURI and encodeURIComponent

j'ai généré cette table facilement avec la console .tableau dans Google Chrome avec ce code:

var arr = [];
for(var i=0;i<256;i++) {
  var char=String.fromCharCode(i);
  if(encodeURI(char)!==encodeURIComponent(char)) {
    arr.push({
      character:char,
      encodeURI:encodeURI(char),
      encodeURIComponent:encodeURIComponent(char)
    });
  }
}
console.table(arr);
394
répondu Johann Echavarria 2014-11-14 13:52:19

j'ai trouvé cet article instructif : Javascript Folie: Chaîne De Requête D'Analyse

Je l'ai trouvé quand j'essayais de comprendre pourquoi le composant de décodeur ne décodait pas '+' correctement. Voici un extrait:

String:                         "A + B"
Expected Query String Encoding: "A+%2B+B"
escape("A + B") =               "A%20+%20B"     Wrong!
encodeURI("A + B") =            "A%20+%20B"     Wrong!
encodeURIComponent("A + B") =   "A%20%2B%20B"   Acceptable, but strange

Encoded String:                 "A+%2B+B"
Expected Decoding:              "A + B"
unescape("A+%2B+B") =           "A+++B"       Wrong!
decodeURI("A+%2B+B") =          "A+++B"       Wrong!
decodeURIComponent("A+%2B+B") = "A+++B"       Wrong!
43
répondu Damien 2012-10-09 09:26:43

encodeURIComponent ne Code pas -_.!~*'() , ce qui cause des problèmes dans l'affichage des données à php dans la chaîne xml.

par exemple:

<xml><text x="100" y="150" value="It's a value with single quote" /> </xml>

Général s'échapper 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 pouvez voir, une seule citation n'est pas encodée. Pour résoudre le problème j'ai créé deux fonctions pour résoudre le problème dans mon projet, pour encoder URL:

function encodeData(s:String):String{
    return encodeURIComponent(s).replace(/\-/g, "%2D").replace(/\_/g, "%5F").replace(/\./g, "%2E").replace(/\!/g, "%21").replace(/\~/g, "%7E").replace(/\*/g, "%2A").replace(/\'/g, "%27").replace(/\(/g, "%28").replace(/\)/g, "%29");
}

Pour le décodage de L'URL:

function decodeData(s:String):String{
    try{
        return decodeURIComponent(s.replace(/\%2D/g, "-").replace(/\%5F/g, "_").replace(/\%2E/g, ".").replace(/\%21/g, "!").replace(/\%7E/g, "~").replace(/\%2A/g, "*").replace(/\%27/g, "'").replace(/\%28/g, "(").replace(/\%29/g, ")"));
    }catch (e:Error) {
    }
    return "";
}
37
répondu Kirankumar Sripati 2013-07-03 06:53:11

encodeURI () - la fonction escape () est pour l'échappement javascript, PAS HTTP.

36
répondu Daniel Papasian 2008-09-16 19:26:22

Small comparison table Java vs. JavaScript vs. PHP.

1. Java URLEncoder.encode (using UTF8 charset)
2. JavaScript encodeURIComponent
3. JavaScript escape
4. PHP urlencode
5. PHP rawurlencode

char   JAVA JavaScript --PHP---
[ ]     +    %20  %20  +    %20
[!]     %21  !    %21  %21  %21
[*]     *    *    *    %2A  %2A
[']     %27  '    %27  %27  %27 
[(]     %28  (    %28  %28  %28
[)]     %29  )    %29  %29  %29
[;]     %3B  %3B  %3B  %3B  %3B
[:]     %3A  %3A  %3A  %3A  %3A
[@]     %40  %40  @    %40  %40
[&]     %26  %26  %26  %26  %26
[=]     %3D  %3D  %3D  %3D  %3D
[+]     %2B  %2B  +    %2B  %2B
[$]     %24  %24  %24  %24  %24
[,]     %2C  %2C  %2C  %2C  %2C
[/]     %2F  %2F  /    %2F  %2F
[?]     %3F  %3F  %3F  %3F  %3F
[#]     %23  %23  %23  %23  %23
[[]     %5B  %5B  %5B  %5B  %5B
[]]     %5D  %5D  %5D  %5D  %5D
----------------------------------------
[~]     %7E  ~    %7E  %7E  ~
[-]     -    -    -    -    -
[_]     _    _    _    _    _
[%]     %25  %25  %25  %25  %25
[\]     %5C  %5C  %5C  %5C  %5C
----------------------------------------
char  -JAVA-  --JavaScript--  -----PHP------
[ä]   %C3%A4  %C3%A4  %E4     %C3%A4  %C3%A4
[ф]   %D1%84  %D1%84  %u0444  %D1%84  %D1%84
15
répondu 30thh 2015-10-16 13:31:36

se rappeler aussi qu'ils encodent tous des ensembles différents de caractères, et sélectionnez celui dont vous avez besoin de manière appropriée. encodeURI () Code moins de caractères que encodeURIComponent (), qui Code moins de caractères (et aussi différents, au point de dannyp) que escape ().

10
répondu Pseudo Masochist 2008-09-16 19:40:32

je recommande de ne pas utiliser une de ces méthodes est. Écrire votre propre fonction qui fait la bonne chose.

MDN a donné un bon exemple sur le codage d'url montré ci-dessous.

var fileName = 'my file(2).txt';
var header = "Content-Disposition: attachment; filename*=UTF-8''" + encodeRFC5987ValueChars(fileName);

console.log(header); 
// logs "Content-Disposition: attachment; filename*=UTF-8''my%20file%282%29.txt"


function encodeRFC5987ValueChars (str) {
    return encodeURIComponent(str).
        // Note that although RFC3986 reserves "!", RFC5987 does not,
        // so we do not need to escape it
        replace(/['()]/g, escape). // i.e., %27 %28 %29
        replace(/\*/g, '%2A').
            // The following are not required for percent-encoding per RFC5987, 
            //  so we can allow for a little better readability over the wire: |`^
            replace(/%(?:7C|60|5E)/g, unescape);
}

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

10
répondu Jerry Joseph 2014-04-23 16:54:17

pour encoder javascript a donné trois fonctions intégrées -

  1. escape () - ne Code pas @*/+ Cette méthode est dépréciée après L'ECMA 3 et doit donc être évitée.

  2. encodeURI() - ne Code pas ~!@#$&*()=:/,;?+' Il suppose que L'URI est un URI complet, donc ne Code pas les caractères réservés qui ont une signification particulière dans L'URI. Cette méthode est utilisée lorsque l' l'intention est de convertir L'URL complète au lieu de quelque segment spécial de L'URL. Exemple - encodeURI('http://stackoverflow.com'); donnera - http://stackoverflow.com

  3. encodeURIComponent() -ne pas coder - _ . ! ~ * ' ( ) Cette fonction code un élément D'Identificateur de Ressource uniforme (URI) en remplaçant chaque instance de certains caractères par une, deux, trois ou quatre séquences d'échappement représentant l'encodage UTF-8 du caractère. Cette méthode devrait être utilisé pour convertir un composant D'URL. Par exemple, certaines entrées de l'utilisateur doivent être ajoutées Exemple - encodeURI('http://stackoverflow.com'); donnera - http%3A%2F%2Fstackoverflow.com

tout ce codage est effectué en UTF 8 I. e les caractères seront convertis au format UTF-8.

encodeURIComponent diffèrent de encodeURI en ce qu'il encode les caractères réservés et signe dièse # de encodeURI

5
répondu Gaurav Tiwari 2017-04-21 07:55:51

j'ai constaté que l'expérimentation avec les différentes méthodes est un bon contrôle de santé mentale, même après avoir eu une bonne poignée de ce que leurs diverses utilisations et capacités sont.

à 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 encodeURIComponent'ed qui peut être assez difficile à interpréter. Un grand signet avoir:

http://www.the-art-of-web.com/javascript/escape /

3
répondu veeTrain 2013-08-08 12:34:09

j'ai cette fonction...

var escapeURIparam = function(url) {
    if (encodeURIComponent) url = encodeURIComponent(url);
    else if (encodeURI) url = encodeURI(url);
    else url = escape(url);
    url = url.replace(/\+/g, '%2B'); // Force the replacement of "+"
    return url;
};
1
répondu molokoloco 2013-06-21 12:56:02

la réponse acceptée est bonne. Étendre sur la dernière partie:

noter que le composant d'encodeur n'échappe pas au caractère'. Commun bug est de l'utiliser pour créer des attributs html tels que href = 'MyUrl', qui pourraient subir une injection de bug. Si vous construisez html à partir de chaînes de caractères, Utilisez "au lieu de" pour les guillemets d'attribut, ou ajoutez un couche supplémentaire d'encodage ('peut être encodé en tant que %27).

si vous pour être sur le côté sûr, pourcentage encodant les caractères sans réserve devrait être encodé aussi.

vous pouvez utiliser cette méthode pour les échapper (source Mozilla )

function fixedEncodeURIComponent(str) {
  return encodeURIComponent(str).replace(/[!'()*]/g, function(c) {
    return '%' + c.charCodeAt(0).toString(16);
  });
}

// fixedEncodeURIComponent("'") --> "%27"
1
répondu Michael 2017-09-27 06:56:16

réécriture moderne de la réponse de @johann-echavarria:

console.log(
    Array(256)
        .fill()
        .map((ignore, i) => String.fromCharCode(i))
        .filter(
            (char) =>
                encodeURI(char) !== encodeURIComponent(char)
                    ? {
                          character: char,
                          encodeURI: encodeURI(char),
                          encodeURIComponent: encodeURIComponent(char)
                      }
                    : false
        )
)

ou si vous pouvez utiliser un tableau, remplacer console.log par console.table (pour la sortie plus jolie).

0
répondu ryanpcmcquen 2018-02-09 01:45:03