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

en répondant à une autre question, j'ai pris conscience que ma connaissance de Javascript/DOM était devenue un peu dépassée en ce que j'utilise toujours escape/unescape pour encoder le contenu des composants D'URL alors qu'il semble que je devrais maintenant utiliser encodeURIComponent/decodeURIComponent à la place.

ce que je veux savoir c'est ce qui ne va pas avec escape/unescape? Il y a quelques suggestions vagues qu'il y a une sorte de problème autour des caractères Unicode, mais je ne peux pas trouver aucune défini explication.

mon expérience sur le web est assez biaisée, presque tout cela a été écrit de grandes applications Intranet liées à Internet Explorer. Qui a impliqué un grand nombre de l'utilisation de escape/unescape et les applications impliquées supportent Unicode depuis de nombreuses années.

alors quels sont les problèmes Unicode qui escape/unescape sont censés avoir ? Quelqu'un a-t-il des cas d'essai pour démontrer les problèmes ?

42
demandé sur sblundy 2009-03-06 18:51:50

4 réponses

ce que je veux savoir c'est ce qui ne va pas avec escape/escape ?

ils ne sont pas" faux " en tant que tels, ils sont juste leur propre format de chaîne spécial qui ressemble un peu à URI-paramètre-encoding mais en fait n'est pas. En particulier:

  • ‘+’ signifie de plus, pas d'espace
  • il existe un format spécial "%uNNNN" pour encoder des points de code Unicode UTF-16, au lieu d'encoder des octets UTF-8

donc si vous utilisez escape() pour créer URI valeurs des paramètres vous obtiendrez les mauvais résultats pour les chaînes contenant un plus, ou tout autre caractère non-ASCII.

escape () pourrait être utilisé comme un schéma D'encodage interne JavaScript seulement, par exemple pour échapper aux valeurs des cookies. Cependant, maintenant que tous les navigateurs prennent encodeURIComponent en charge (ce qui n'était pas le cas à l'origine), il n'y a aucune raison d'utiliser escape de préférence à cela.

il n'y a qu'une seule utilisation moderne pour escape/escape que je connais, et c'est comme un moyen rapide de implémenter un encodeur/décodeur UTF-8, en tirant parti du traitement UTF-8 dans la gestion des composants D'uric:

utf8bytes= unescape(encodeURIComponent(unicodecharacters));
unicodecharacters= decodeURIComponent(escape(utf8bytes));
38
répondu bobince 2009-03-06 16:24:33

escape ne fonctionne que sur les caractères compris entre 0 et 255 inclusivement (ISO-8859-1, qui est effectivement des points de code unicode pouvant être représentés par un seul octet). (*)

encodeURIComponent les travaux pour toutes les chaînes javascript peut représenter (qui est l'ensemble du plan multilingue de base d'unicode, je les points de code d'unicode 0 à 1.114.111 ou 0x10ff qui couvrent presque n'importe quel système d'écriture humaine dans l'utilisation courante).

les deux fonctions produisent des chaînes sécurisées d'url qui n'utilisent que du code points 0 à 127 inclusivement (US-ASCII), que ce dernier accomplit en encodant d'abord la chaîne en UTF-8 puis en appliquant le %XX encodage hexadécimal familier de escape, à tout point de code qui ne serait pas sûr.

C'est d'ailleurs pourquoi vous pouvez le faire en deux funcall UTF-8 encodeur/décodeur en javascript sans aucune boucle ou génération de déchets, en combinant ces primitives pour annuler tous les effets secondaires sauf le traitement UTF-8, comme le unescape et decodeURIComponent les versions font la même chose à l'envers.

(*) Foot note: certains navigateurs modernes comme Google Chrome ont été modifiés pour produire %uXXXX pour la gamme de caractères ci-dessus-255 escape n'a pas été défini à l'origine pour, mais le soutien de serveur web pour le décodage que l'encodage n'est pas aussi bien mis en œuvre que le décodage de l'IETF standardisé UTF-8 encoding.

8
répondu ecmanaut 2012-10-07 20:36:37

La meilleure Réponse est ce qu'il fonctionne en ligne sur ce site http://meyerweb.com/eric/tools/dencoder/

function decode() {
    var obj = document.getElementById('dencoder');
    var encoded = obj.value;
    obj.value = decodeURIComponent(encoded.replace(/\+/g,  " "));
}
6
répondu ucefkh 2013-11-16 01:00:16

un autre usage "moderne" que j'ai rencontré est l'analyse D'une chaîne encodée par URI qui peut inclure des séquences d'octets UTF8 invalides. Dans certains cas decodeURIComponent peut jeter une exception. Vous pourriez avoir besoin d'attraper cette exception et de revenir à l'utilisation de unescape.

un exemple serait' tür 'encodé comme' t%FCr' que J'ai vu Firefox produire (quand les caractères sont collés dans la barre d'adresse après le ?).

4
répondu sstur 2011-10-11 12:52:54