49 votes

decodeURIComponent vs unescape, qu'est-ce qui ne va pas avec unescape?

En répondant à une autre question, j'ai pris conscience que mon Javascript/DOM connaissance était devenue un peu obsolète dans la mesure où je suis toujours à l'aide d' escape/unescape pour encoder le contenu de l'URL de composants alors qu'il semble que je devrais maintenant être en utilisant encodeURIComponent/decodeURIComponent à la place.

Ce que je veux savoir, c'est quel est le problème avec escape/unescape ? Il y a quelques vagues suggestions qu'il y a une sorte de problème autour des caractères Unicode, mais je ne trouve aucune explication précise.

Mon expérience sur le web est assez biaisé, presque toutes il a été écrit gros Intranet, applications liées à Internet Explorer. Qui a impliqué un grand nombre de l'utilisation de escape/unescape et les applications concernées ont entièrement pris en charge le format Unicode pour de nombreuses années maintenant.

Quels sont donc les Unicode problèmes qu' escape/unescape sont censés avoir ? Quelqu'un at-il des cas de test pour démontrer les problèmes ?

41voto

bobince Points 270740

Ce que je veux savoir, c'est quel est le problème avec échappement/ne pas encoder ?

Ils ne sont pas "mauvais" en tant que tel, ils ne font que leur propre format de chaîne de caractères qui ressemble un peu à l'URI-de paramètre de codage mais ne l'est pas. En particulier:

  • ‘+' signifie de plus, pas d'espace
  • il y a un spécial "%uNNNN" format pour l'encodage Unicode UTF-16 points de code, au lieu de l'encodage UTF-8 octets

Donc, si vous utilisez escape() pour créer des URI des valeurs de paramètre, vous obtiendrez des résultats erronés pour les chaînes contenant un plus, ou tous les caractères non-ASCII.

escape() pourrait être utilisé comme un interne JavaScript seule schéma de codage, par exemple pour échapper à la valeur du cookie. Mais maintenant que tous les navigateurs prennent en charge encodeURIComponent (ce qui n'était pas à l'origine le cas), il n'y a aucune raison d'échapper à utiliser de préférence à celle.

Il y a un seul usage moderne pour échapper à/ne pas encoder que je connais, et c'est aussi un moyen rapide de mettre en œuvre un codage UTF-8 encodeur/décodeur, en tirant parti de l'UTF-8 traitement dans URIComponent manipulation:

utf8bytes= unescape(encodeURIComponent(unicodecharacters));
unicodecharacters= decodeURIComponent(escape(utf8bytes));

11voto

ecmanaut Points 1688

escape n'opère que sur des caractères dans la plage de 0 à 255 inclus (ISO-8859-1, qui est effectivement des points de code unicode représentable avec un seul octet). (*)

encodeURIComponent fonctionne pour toutes les chaînes de javascript peut représenter (qui est l'ensemble de la gamme de l'unicode du plan multilingue de base, j'ai e des points de code unicode de 0 à 1,114,111 ou 0x10FFFF qui couvrent la quasi-humain système d'écriture en cours d'utilisation).

Les deux fonctions produisent url sûr chaînes qui utilisent uniquement les points de code de 0 à 127 inclus (US-ASCII), que celui-ci accomplit par la première codant pour la chaîne en UTF-8, puis d'appliquer l' %XX codage hexadécimal familier de escape, à tout point de code, qui ne serait pas l'url de sécurité.

C'est d'ailleurs pourquoi vous pouvez le faire en deux funcall UTF-8 encodeur/décodeur en javascript, sans boucles ou des ordures génération, par la combinaison de ces primitives pour annuler tous, mais l'UTF-8-traitement des effets secondaires, comme l' unescape et decodeURIComponent versions faire la même chose en sens inverse.

(*) Note: Certains navigateurs modernes comme Google Chrome ont été ajustés pour produire de l' %uXXXX pour ci-255 plage de caractères d'échappement n'a pas été défini à l'origine, mais de du serveur web de soutien pour le décodage que l'encodage n'est pas aussi bien mis en œuvre que le décodage de l'IETF normalisés selon l'UTF-8 en fonction de l'encodage.

7voto

ucefkh Points 457

La meilleure réponse est que cela fonctionne en ligne sur ce site Web http://meyerweb.com/eric/tools/dencoder/

 function decode() {
    var obj = document.getElementById('dencoder');
    var encoded = obj.value;
    obj.value = decodeURIComponent(encoded.replace(/\+/g,  " "));
}
 

5voto

sstur Points 366

Une autre utilisation "moderne" que je connaisse consiste à analyser une chaîne codée en URI pouvant inclure des séquences d'octets UTF8 non valides. Dans certains cas, decodeURIComponent peut générer une exception. Vous devrez peut-être attraper cette exception et vous remettre à utiliser unescape.

Un exemple serait 'tür' codé comme 't% FCr' que j'ai vu produire par Firefox (lorsque des caractères sont collés dans la barre d'adresse après le??).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X