Al codificar una cadena de consulta para enviarla a un servidor web: cuándo se usa escape()
y cuándo se usa encodeURI()
o encodeURIComponent()
:
Usar escape:
escape("% +&=");
O
use encodeURI () / encodeURIComponent ()
encodeURI("http://www.google.com?var1=value1&var2=value2");
encodeURIComponent("var1=value1&var2=value2");
encodeURIComponent("var1=value1&var2=value2")
es el caso de uso típico. ¡Ese ejemplo codificará el y , que probablemente no sea lo que se pretendía! normalmente se aplica por separado solo al valor en cada par de valores clave (la parte después de cada uno ).=
&
encodeURIComponent
=
var params = encodeURIComponent(key) + '=' + encodeURIComponent(value);
- Quizás alguien más conozca una mejor manera.Respuestas:
escapar()
¡No lo uses!
escape()
se define en la sección B.2.1.2 escape y el texto de introducción del Anexo B dice:Comportamiento:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/escape
Los caracteres especiales se codifican con la excepción de: @ * _ + -. /
La forma hexadecimal para los caracteres, cuyo valor de unidad de código es 0xFF o menos, es una secuencia de escape de dos dígitos:
%xx
.Para los caracteres con una unidad de código mayor,
%uxxxx
se utiliza el formato de cuatro dígitos . Esto no está permitido dentro de una cadena de consulta (como se define en RFC3986 ):Un signo de porcentaje solo se permite si está seguido directamente por dos dígitos hexadecimales, porcentaje seguido por
u
no está permitido.encodeURI ()
Use encodeURI cuando desee una URL que funcione. Haz esta llamada:
Llegar:
No llame a encodeURIComponent ya que destruiría la URL y devolvería
encodeURIComponent ()
Use encodeURIComponent cuando desee codificar el valor de un parámetro de URL.
Luego puede crear la URL que necesita:
Y obtendrá esta URL completa:
http://example.net/?param1=http%3A%2F%2Fexample.org%2F%Ffa%3D12%26b%3D55¶m2=99
Tenga en cuenta que encodeURIComponent no escapa al
'
personaje. Un error común es usarlo para crear atributos html comohref='MyUrl'
, que podría sufrir un error de inyección. Si está construyendo html a partir de cadenas, use en"
lugar de'
comillas de atributos o agregue una capa adicional de codificación ('
puede codificarse como% 27).Para obtener más información sobre este tipo de codificación, puede consultar: http://en.wikipedia.org/wiki/Percent-encoding
fuente
'
por'
) antes de colocarlos en un documento HTML.La diferencia entre
encodeURI()
yencodeURIComponent()
son exactamente 11 caracteres codificados por encodeURIComponent pero no por encodeURI:Generé esta tabla fácilmente con console.table en Google Chrome con este código:
fuente
var arr=[]; for(var i=0;i<256;i++){var char=String.fromCharCode(i); if(encodeURI(char)!==encodeURIComponent(char)) console.log("character: "+char + " | encodeURI: " +encodeURI(char) + " |encodeURIComponent: " + encodeURIComponent(char) ) }
Encontré este artículo esclarecedor: Javascript Madness: Query String Parsing
Lo encontré cuando intentaba entender y por qué decodeURIComponent no estaba decodificando '+' correctamente. Aquí hay un extracto:
fuente
encodeURI
parece que solo es útil en un caso marginal bastante oscuro y que realmente no necesita existir. Tengo algunas diferencias de opinión con él, pero no veo nada absolutamente falso o idiota allí. ¿Qué crees que es una tontería exactamente?enctype
atributo delFORM
elemento especifica el tipo de contenido utilizado para codificar el conjunto de datos del formulario para su envío al servidor. application / x-www-form-urlencoded Este es el tipo de contenido predeterminado. Los formularios enviados con este tipo de contenido deben codificarse de la siguiente manera: [...] los caracteres de espacio se reemplazan por `` + '' y los [...] caracteres no alfanuméricos se reemplazan por '% HH', [...] Ref: HTML4 SepcencodeURIComponent no codifica
-_.!~*'()
, lo que causa problemas al publicar datos en php en una cadena xml.Por ejemplo:
<xml><text x="100" y="150" value="It's a value with single quote" /> </xml>
Escape general con
encodeURI
%3Cxml%3E%3Ctext%20x=%22100%22%20y=%22150%22%20value=%22It's%20a%20value%20with%20single%20quote%22%20/%3E%20%3C/xml%3E
Como puede ver, la comilla simple no está codificada. Para resolver el problema, creé dos funciones para resolver el problema en mi proyecto, para URL de codificación:
Para decodificar URL:
fuente
encodeURI (): la función escape () es para el escape de JavaScript, no HTTP.
fuente
var url = "http://kuler-api.adobe.com/rss/get.cfm?startIndex=0&itemsPerPage=20&timeSpan=0&listType=rating"
... Y quiero acceder a ella a través de la API de Google Ajax, así:var gurl = "http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&callback=?&q=" + url;
... entonces tengo que usarlaescape(url)
.encodeURI(url)
no funciona con parámetros como ese parece.Pequeña tabla de comparación Java vs. JavaScript vs. PHP.
fuente
Recomiendo no usar uno de esos métodos tal como está. Escribe tu propia función que hace lo correcto.
MDN ha dado un buen ejemplo sobre la codificación de URL que se muestra a continuación.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent
fuente
También recuerde que todos codifican diferentes conjuntos de caracteres y seleccione el que necesita de forma adecuada. encodeURI () codifica menos caracteres que encodeURIComponent (), que codifica menos caracteres (y también diferentes, al punto de dannyp) que escape ().
fuente
Con el fin de codificar, JavaScript ha dado tres funciones incorporadas:
escape()
- no codifica@*/+
Este método está en desuso después del ECMA 3, por lo que debe evitarse.encodeURI()
- no codifica~!@#$&*()=:/,;?+'
Se supone que el URI es un URI completo, por lo que no codifica caracteres reservados que tienen un significado especial en el URI. Este método se utiliza cuando la intención es convertir la URL completa en lugar de un segmento especial de URL. Ejemplo -encodeURI('http://stackoverflow.com');
dará - http://stackoverflow.comencodeURIComponent()
- no codifica- _ . ! ~ * ' ( )
Esta función codifica un componente de Identificador Uniforme de Recursos (URI) al reemplazar cada instancia de ciertos caracteres por una, dos, tres o cuatro secuencias de escape que representan la codificación UTF-8 del carácter. Este método debe usarse para convertir un componente de URL. Por ejemplo, se debeencodeURIComponent('http://stackoverflow.com');
agregar alguna entrada del usuario Ejemplo: dará - http% 3A% 2F% 2Fstackoverflow.comToda esta codificación se realiza en UTF 8, es decir, los caracteres se convertirán en formato UTF-8.
encodeURIComponent difiere de encodeURI en que codifica caracteres reservados y el signo de número # de encodeURI
fuente
Descubrí que experimentar con los diversos métodos es un buen control de la cordura, incluso después de tener un buen manejo de cuáles son sus diversos usos y capacidades.
Con ese fin, he encontrado este sitio web extremadamente útil para confirmar mis sospechas de que estoy haciendo algo adecuadamente. También ha resultado útil para decodificar una cadena encodeURIComponent'ed que puede ser bastante difícil de interpretar. Un gran marcador para tener:
http://www.the-art-of-web.com/javascript/escape/
fuente
La respuesta aceptada es buena. Para extender en la última parte:
Si desea estar en el lado seguro, codifique el porcentaje de caracteres no reservados debe no reservados.
Puedes usar este método para escapar de ellos (fuente Mozilla )
fuente
Reescritura moderna de la respuesta de @ johann-echavarria:
O si puede usar una tabla, reemplácela
console.log
conconsole.table
(para la salida más bonita).fuente
Inspirado por la mesa de Johann , he decidido extender la mesa. Quería ver qué caracteres ASCII se codifican.
Mostrar fragmento de código
La tabla muestra solo los caracteres codificados. Las celdas vacías significan que los caracteres originales y codificados son iguales.
Sólo para ser extra, estoy añadiendo otra mesa para
urlencode()
vsrawurlencode()
. La única diferencia parece ser la codificación del carácter espacial.fuente
Tengo esta función ...
fuente
encodeURI
no existe peroescape
existe.