2009-03-06 26 views
42

Al responder a otra pregunta, me di cuenta de que mi conocimiento de Javascript/DOM estaba un poco desactualizado porque todavía estoy usando escape/unescape para codificar el contenido de los componentes de URL mientras que ahora debería estar usando encodeURIComponent/decodeURIComponent .decodeURIComponent vs unescape, ¿qué hay de malo en unescape?

Lo que quiero saber es qué hay de malo en escape/unescape? Hay algunas sugerencias vagas de que hay algún tipo de problema con los caracteres Unicode, pero no puedo encontrar ninguna explicación definitiva.

Mi experiencia web es bastante sesgada, casi todo ha sido escribir grandes aplicaciones de Intranet relacionadas con Internet Explorer. Esto ha implicado un gran uso de escape/unescape y las aplicaciones involucradas han sido totalmente compatibles con Unicode durante muchos años.

¿Cuáles son los problemas Unicode que se supone que tienen escape/unescape? ¿Alguien tiene casos de prueba para demostrar los problemas?

+0

creo [cubre artículo] esto (http://xkr.us/articles/javascript/encode-compare/) bastante bien –

+0

Excelente, justo lo que quería. Veo que el problema es que Mozilla no se puede librar de Unicode, lo que explica por qué no he tenido ningún problema al usar una aplicación exclusiva de IE. – andynormancx

+0

Soy bendecido y maldecido por mi historial de trabajo con aplicaciones de Intranet solo de IE. Bendito porque nunca tengo que lidiar con las diferencias de IE/FF y maldito por la misma razón. – andynormancx

Respuesta

37

Lo que quiero saber es qué hay de malo con escape/unescape?

No son "incorrectos" como tales, son simplemente su propio formato de cadena especial que se parece un poco a la codificación de parámetros URI, pero en realidad no lo es. En particular:

  • '+' significa plus, no espacio
  • hay un formato especial “% uNNNN” para la codificación Unicode UTF-16-puntos de código, en lugar de codificación UTF-8 bytes

Por lo tanto, si usa escape() para crear valores de parámetros URI, obtendrá resultados incorrectos para cadenas que contengan un signo más o caracteres que no sean ASCII.

escape() podría utilizarse como un esquema de codificación interno solo de JavaScript, por ejemplo, para escapar de los valores de las cookies. Sin embargo, ahora que todos los navegadores son compatibles con encodeURIComponent (que originalmente no era el caso), no hay ninguna razón para usar escape en lugar de eso.

Sólo hay un uso moderno para el escape/unescape que yo sepa, y eso es como una forma rápida de implementar un UTF-8 codificador/decodificador, al aprovechar el procesamiento de UTF-8 en el manejo URIComponent:

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

Una gran referencia: http://unixpapa.com/js/querystring.html - en el escape obsoleto/unescape, mudo encodeURI/decodeURI y decodeURIComponent/encodeURIComponent - peculiaridades y cómo usarlo. decodeURIComponent no convierte "+" en espacio. –

+0

escape escapará de una comilla simple, mientras que encodeURI no lo hará. Lo cual lo hace inútil para mi proyecto. –

+0

bobince- Actualmente estoy usando exactamente ese enfoque para obtener el utf8bytes = unescape (encodeURIComponent (unicodecharacters)); ¿Cómo puedo lograr el mismo resultado después de que los navegadores dejan de soportar el método de escape? Gracias. – acabra85

4

Otro uso "moderno" que me he encontrado es el análisis de una cadena codificada en URI que puede incluir secuencias de bytes UTF8 no válidas. En ciertos casos decodeURIComponent puede arrojar una excepción. Es posible que deba detectar esta excepción y recurrir al uso de unescape.

Un ejemplo sería 'tür' codificado como 't% FCr' que he visto producir Firefox (cuando los caracteres se pegan en la barra de direcciones después de?).

+0

Parece que el error se solucionó en Firefox. Sin embargo, no es improbable que algunas personas codifiquen erróneamente caracteres usando ISO-8859-1 en lugar de UTF-8. –

7

escape funciona solo en caracteres en el rango de 0 a 255 inclusive (ISO-8859-1, que es efectivamente unicode puntos de código representables con un solo byte). (*)

encodeURIComponent funciona para todas las cadenas que javascript puede representar (que es todo el rango del plano multilingüe básico de Unicode, códigos de punto unicode 0 a 1,114,111 o 0x10FFFF que cubren casi cualquier sistema de escritura humano en uso actual).

Ambas funciones producen URL segura cadenas que sólo utilizan puntos de código 0 a 127 inclusive (US-ASCII), que este último logra el por primera codifica la cadena como UTF-8 y luego aplicar la codificación %XX hex familiar de escape, a cualquier punto de código que no sería seguro para la url.

Este es por cierto eso que se puede make a two-funcall UTF-8 encoder/decoder en javascript sin ningún tipo de lazos o de basura generación, mediante la combinación de estas primitivas para anular todos, pero los efectos secundarios-8-procesamiento UTF, como los unescape y decodeURIComponent versiones hacen lo mismo a la inversa.

(*) Nota: Algunos navegadores modernos como Google Chrome han sido modificados para producir% uXXXX para los 255 rangos de caracteres por encima de los cuales no se definió el escape, pero el soporte del servidor web para decodificar esa codificación no es bien implementado como decodificación de la codificación basada en IETF UTF-8.

6

La mejor respuesta es la que está funcionando en línea en este sitio web http://meyerweb.com/eric/tools/dencoder/

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