¿Cuál es la diferencia entre las funciones de JavaScript decodeURIComponent
y decodeURI
?
¿Cuál es la diferencia entre las funciones de JavaScript decodeURIComponent
y decodeURI
?
Respuestas:
Para explicar la diferencia entre estos dos, permítanme explicar la diferencia entre encodeURI
y encodeURIComponent
.
La principal diferencia es que:
encodeURI
función está diseñada para usarse en el URI completo.encodeURIComponent
función está destinada a ser utilizada en ... bueno ... componentes URI que es cualquier parte que se encuentra entre los separadores (; /?: @ & = + $, #).Entonces, en encodeURIComponent
estos separadores también se codifican porque se consideran texto y no caracteres especiales.
Ahora volviendo a la diferencia entre las funciones de decodificación, cada función decodifica las cadenas generadas por su correspondiente codificación, cuidando la semántica de los caracteres especiales y su manejo.
encodeURIComponent / decodeURIComponent () es casi siempre el par que desea usar, para concatenar y dividir cadenas de texto en partes de URI.
encodeURI en menos común, y con un nombre engañoso: realmente debería llamarse fixBrokenURI. Toma algo que es casi un URI, pero tiene caracteres no válidos, como espacios, y lo convierte en un URI real. Tiene un uso válido para reparar URI no válidos de la entrada del usuario, y también se puede usar para convertir un IRI (URI con caracteres Unicode desnudos) en un URI simple (usando UTF-8 con% de escape para codificar el no ASCII )
decodeURI decodifica los mismos caracteres que decodeURIComponent, excepto algunos especiales. Se proporciona para ser un inverso de encodeURI, pero aún no puede contar con que regrese lo mismo que introdujo originalmente; consulte, por ejemplo. decodeURI(encodeURI('%20 '));
.
Donde encodeURI realmente debería llamarse fixBrokenURI (), decodeURI () también podría llamarse potencialmenteBreakMyPreviouslyWorkingURI (). No se me ocurre ningún uso válido en ningún lado; evitar.
js> s = "http://www.example.com/string with + and ? and & and spaces";
http://www.example.com/string with + and ? and & and spaces
js> encodeURI(s)
http://www.example.com/string%20with%20+%20and%20?%20and%20&%20and%20spaces
js> encodeURIComponent(s)
http%3A%2F%2Fwww.example.com%2Fstring%20with%20%2B%20and%20%3F%20and%20%26%20and%20spaces
Parece que encodeURI
produce un URI "seguro" al codificar espacios y algunos otros caracteres (por ejemplo, no imprimibles), mientras que encodeURIComponent
adicionalmente codifica los dos puntos, la barra diagonal y los caracteres más, y está destinado a ser utilizado en cadenas de consulta. La codificación de + y? y & es de particular importancia aquí, ya que estos son caracteres especiales en las cadenas de consulta.
Como tenía la misma pregunta, pero no encontré la respuesta aquí, hice algunas pruebas para averiguar cuál es la diferencia en realidad. Hice esto, ya que necesito la codificación de algo, que no está relacionado con URL / URI.
encodeURIComponent("A")
devuelve "A", no codifica "A" a "% 41"decodeURIComponent("%41")
devuelve "A".encodeURI("A")
devuelve "A", no codifica "A" a "% 41"decodeURI("%41")
devuelve "A".-Eso significa que ambos pueden decodificar caracteres alfanuméricos, aunque no los hayan codificado. Sin embargo...
encodeURIComponent("&")
devuelve "% 26".decodeURIComponent("%26")
devoluciones "&".encodeURI("&")
devoluciones "&".decodeURI("%26")
devuelve "% 26".Aunque encodeURIComponent no codifica todos los caracteres, decodeURIComponent puede decodificar cualquier valor entre% 00 y% 7F.
Nota: Parece que si intenta decodificar un valor superior a% 7F (a menos que sea un valor unicode), su secuencia de comandos fallará con un "error de URI".
encodeURIComponent()
Convierte la entrada en una cadena codificada en URL
encodeURI()
La URL codifica la entrada, pero supone que se proporciona una URL completa, por lo que devuelve una URL válida al no codificar el protocolo (por ejemplo, http: // ) y el nombre de host (por ejemplo, www.stackoverflow.com ).
decodeURIComponent()
y decodeURI()
son lo opuesto a lo anterior
encodeURIComponent no escapado:
A-Z a-z 0-9 - _ . ! ~ * ' ( )
encodeURI () no escapado:
A-Z a-z 0-9 ; , / ? : @ & = + $ - _ . ! ~ * ' ( ) #
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURI
decodeURIComponent("%C3%A9") == "é"; unescape("%C3%A9") == "é";