write unescape parse online escape javascript encoding escaping dhtml

javascript - parse - decodeURIComponent vs unescape, ¿qué hay de malo en unescape?



unescape html (4)

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 la URL, mientras que ahora debería estar usando encodeURIComponent / decodeURIComponent .

Lo que quiero saber es qué pasa con 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 parcial, casi todo ha sido escribir grandes aplicaciones de Intranet vinculadas a Internet Explorer. Eso ha implicado un gran uso de escape / unescape y las aplicaciones involucradas han sido totalmente compatibles con Unicode durante muchos años.

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


Lo que quiero saber es qué pasa con escape / unescape?

No están "equivocados" como tales, son solo 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 más, no espacio
  • existe un formato especial "% uNNNN" para codificar puntos de código Unicode UTF-16, en lugar de codificar bytes UTF-8

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 usarse 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.

Solo conozco un uso moderno para escape / unescape, y eso es una manera rápida de implementar un codificador / decodificador UTF-8, aprovechando el procesamiento UTF-8 en el manejo de URIComponent:

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


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?).


escape opera solo en caracteres en el rango de 0 a 255 inclusive (ISO-8859-1, que es efectivamente 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, es decir, puntos de código unicode 0 a 1,114,111 o 0x10FFFF que cubren casi cualquier sistema de escritura humano en uso actual).

Ambas funciones producen cadenas url safe que solo usan los puntos de código 0 a 127 inclusive (US-ASCII), que este último logra codificando primero la cadena como UTF-8 y luego aplicando la codificación %XX hex desde el escape , a cualquier punto de código eso no sería seguro para la url

Por cierto, este es el motivo por el que puede crear un codificador / decodificador UTF-8 de dos caracteres en javascript sin bucles o generación de basura, al combinar estas primitivas para cancelar todos los efectos secundarios del procesamiento UTF-8, como las versiones decodeURIComponent y decodeURIComponent haz lo mismo a la inversa

(*) Nota al pie: algunos navegadores modernos como Google Chrome han sido modificados para producir% uXXXX para los 255 rangos de caracteres por los que no se definió el escape originalmente, pero la compatibilidad del servidor web para decodificar esa codificación no está tan bien implementada como decodificando la codificación basada en IETF UTF-8 estandarizada.


La mejor respuesta es que está trabajando 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, " ")); }