Dois-je utiliser encodeURI ou encodeURIComponent pour encoder les URL?


282

Laquelle de ces deux méthodes doit être utilisée pour encoder les URL?



13
Une différence majeure est que encodeURIcela ne sera pas encodé /donc: encodeURIComponent("ac/dc")=> ac%2Fdcet encodeURI("ac/dc")=>ac/dc

Cela pourrait être utile: "encodeURIComponent() and encodeURI() encode a URI by replacing URL reserved characters with their UTF-8 encoding....They differ because encodeURI does not encode queryString or hash values...URLs do not allow many special characters, like spaces or slashes. However these special characters are part of life, so URL encoding was invented." Source
user1063287

Voir également la section spécifique intitulée encodeURIComponent differs from encodeURI as follows: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
user1063287

Réponses:


324

Cela dépend de ce que vous voulez réellement faire.

encodeURI suppose que l'entrée est un URI complet qui peut contenir des caractères qui doivent être encodés.

encodeURIComponent va tout coder avec une signification spéciale, vous l'utilisez donc pour des composants d'URI tels que

var world = "A string with symbols & characters that have special meaning?";
var uri = 'http://example.com/foo?hello=' + encodeURIComponent(world);

108

Si vous encodez une chaîne à insérer dans un composant URL (un paramètre de chaîne de requête), vous devez appeler encodeURIComponent.

Si vous encodez une URL existante, appelez encodeURI.


1
Si j'utilise ajax, comment décoder l'URL transmise à php?
Aditya Shukla

6
Non. Le serveur Web le fait automatiquement.
Quentin

@Aditya: Cela dépend de ce que vous faites.
SLaks

@slaks. Je passe des paramètres via get, donc je veux les récupérer en php.
Aditya Shukla

2
Bien. J'aurais peut-être parlé un peu à la hâte quand j'ai dit que le serveur Web le ferait, mais quelle que soit la bibliothèque que vous utilisez pour lire vos données de formulaire, elle s'en chargera pour vous.
Quentin

47

xkr.us a une grande discussion, avec des exemples. Pour citer leur résumé:

La méthode escape () n'encode pas le caractère + qui est interprété comme un espace côté serveur ainsi que généré par des formulaires avec des espaces dans leurs champs. En raison de cette lacune et du fait que cette fonction ne parvient pas à gérer correctement les caractères non ASCII, vous devez éviter d'utiliser escape () autant que possible. La meilleure alternative est généralement encodeURIComponent ().

escape () ne codera pas: @ * / +

L'utilisation de la méthode encodeURI () est un peu plus spécialisée que escape () dans la mesure où elle code pour les URI par opposition à la chaîne de requête, qui fait partie d'une URL. Utilisez cette méthode lorsque vous devez coder une chaîne à utiliser pour toute ressource qui utilise des URI et a besoin de certains caractères pour rester non codés. Notez que cette méthode ne code pas le caractère ', car il s'agit d'un caractère valide dans les URI.

encodeURI () ne codera pas: ~! @ # $ & * () =: /,;? + '

Enfin, la méthode encodeURIComponent () doit être utilisée dans la plupart des cas lors du codage d'un seul composant d'un URI. Cette méthode encodera certains caractères qui seraient normalement reconnus comme caractères spéciaux pour les URI, de sorte que de nombreux composants pourraient être inclus. Notez que cette méthode ne code pas le caractère ', car il s'agit d'un caractère valide dans les URI.

encodeURIComponent () ne codera pas: ~! * () '


Récemment appris. Les serveurs TOMCAT 9 sont plus précis sur ce que vous pouvez envoyer à l'URL. encodeURIComponent () semble mieux fonctionner dans les cas où vous avez des "espaces" dans ce que vous devez encoder. Tomcat 8 s'en fichait mais 9 est bien plus particulier.
Aggie Jon du 87

En d' autres termes encodeURIéchoue si vous essayez de convertir un nom de fichier à une URL et le nom du fichier a #en elle
gman

17

Voici un résumé.

  1. escape () ne codera pas @ * _ + -. /

    Ne l'utilise pas.

  2. encodeURI () ne codera pas AZ az 0-9; , /? : @ & = + $ - _. ! ~ * '() #

    Utilisez-le lorsque votre entrée est une URL complète comme « https://searchexample.com/search?q=wiki »

  3. encodeURIComponent () ne codera pas AZ az 0-9 - _. ! ~ * '() Utilisez-le lorsque votre entrée fait partie d'une URL complète, par exemple const queryStr = encodeURIComponent(someString)

1
C'est une excellente réponse car elle indique exactement ce qu'ils font. Cependant, j'ai encore une question sur laquelle dois-je utiliser et quand. Que faire si mon composant URI est une URL complète? Dois-je ensuite utiliser la règle 2 ou la règle 3 d'en haut OU peut-être les deux comme encodeURIComponent (encodeURI (theCompleteURI))
Panu Logic

10

encodeURIComponent (): suppose que son argument est une partie (telle que le protocole, le nom d'hôte, le chemin ou la chaîne de requête) d'un URI. Par conséquent, il échappe aux caractères de ponctuation qui sont utilisés pour séparer les portions d'un URI.

encodeURI (): est utilisé pour encoder l'url existante


7

Différence entre encodeURIet encodeURIComponent:

encodeURIComponent(value)est principalement utilisé pour coder les valeurs des paramètres queryString et il code tous les caractères applicables dans value. encodeURIignore le préfixe de protocole ( http://) et le nom de domaine.


Dans des cas très, très rares, lorsque vous souhaitez implémenter un encodage manuel pour encoder des caractères supplémentaires (bien qu'ils n'aient pas besoin d'être encodés dans des cas typiques) comme:, ! *alors vous pouvez utiliser:

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

( source )


6
Vous ne devez pas échapper à ces caractères en url.
Arashsoft

Comme le dit la documentation citée: "ces caractères n'ont pas d'utilisations de délimitation URI formalisées"
caesarsol

@caesarsol donc, dois-je modifier ma réponse. laissez-moi savoir vos pensées parce que je ne peux pas comprendre ce que signifie la documentation citée ..
T.Todua

il est juste inutile de coder ces caractères, à moins que vous ne fassiez quelque chose hors des cas d'utilisation habituels de codage d'URL :)
caesarsol

2

D'autres réponses décrivent les objectifs. Voici les caractères que chaque fonction convertira réellement :

control = '\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F'
        + '\x10\x11\x12\x13\x14\X15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F'
                                                                    + '\x7F'
encodeURI         (control + ' "%<>[\\]^`{|}'                             )
encodeURIComponent(control + ' "%<>[\\]^`{|}' + '#$&,:;=?' + '+/@'        )
escape            (control + ' "%<>[\\]^`{|}' + '#$&,:;=?' +       "!'()~")

Tous les caractères ci-dessus sont convertis en codes à pourcentage hexadécimal. Espace vers %20, pourcentage vers %25, etc. Les caractères ci-dessous passent inchangés.

Voici les caractères que les fonctions NE convertiront PAS :

pass_thru = '*-._0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'

encodeURI         (pass_thru + '#$&,:;=?' + '+/@' + "!'()~")
encodeURIComponent(pass_thru +                      "!'()~")
escape            (pass_thru +              '+/@'          )

-4

En règle générale, utilisez encodeURIComponent. N'ayez pas peur du nom long en pensant qu'il est plus spécifique dans son utilisation, pour moi, c'est la méthode la plus couramment utilisée. Ne soyez pas non plus obligé d'utiliser encodeURI parce que vous l'avez testé et qu'il semble encoder correctement, ce n'est probablement pas ce que vous vouliez utiliser et même si votre test simple en utilisant "Fred" dans un champ de prénom a fonctionné, vous trouverez plus tard, lorsque vous utiliserez du texte plus avancé comme l'ajout d'une esperluette ou d'un hashtag, il échouera. Vous pouvez regarder les autres réponses pour les raisons pour lesquelles cela est.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.