¿Cuál es la diferencia entre las funciones JavaScript decodeURIComponent
y decodeURI
?
Para explicar la diferencia entre estos dos déjame explicar la diferencia entre encodeURI
y encodeURIComponent
.
La principal diferencia es que:
encodeURI
está pensada para ser utilizada en el URI completo.encodeURIComponent
está pensada para ser utilizada en... bueno... componentes del URI, es decir
cualquier parte que se encuentre entre separadores (; / ? : @ & = + $ , #).Así, en encodeURIComponent
estos separadores se codifican también porque se consideran texto y no caracteres especiales.
Volviendo a la diferencia entre las funciones de decodificación, cada función decodifica las cadenas generadas por su correspondiente homólogo de codificación cuidando la semántica de los caracteres especiales y su manejo.
codificarURIComponente/decodificarURIComponente() es casi siempre el par que se quiere usar, para concatenar juntos y separar las cadenas de texto en las partes de la URI.
codificarURI en menos común, y con nombres engañosos: realmente debería llamarse fixBrokenURI. Toma algo que's casi una URI, pero tiene caracteres inválidos como espacios en ella, y la convierte en una URI real. Tiene un uso válido para arreglar URIs inválidas a partir de la entrada del usuario, y también puede ser usado para convertir una IRI (URI con caracteres Unicode desnudos) en una URI simple (usando %-escapado UTF-8 para codificar la no-ASCII).
decodeURI decodifica los mismos caracteres que decodeURIComponente excepto por algunos especiales.
Se proporciona para ser un inverso de la codificación deURI, pero aún así puedes'no cuentes con que devuelva lo mismo que pusiste originalmente in - see por ejemplo.
decodeURI(encodeURI('%20 '));
.
Donde codificarURI realmente debería ser llamado fixBrokenURI(), decodeURI() podría ser igualmente llamado potencialmenteBreakMyPreviouslyWorkingURI(). No se me ocurre ningún uso válido para ello en ninguna parte; 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" codificando los espacios y algunos otros caracteres (por ejemplo, no imprimibles), mientras que encodeURIComponent
codifica adicionalmente los dos puntos y la barra y los caracteres +, y está pensado para ser utilizado en las cadenas de consulta. La codificación de + y ? y & es de particular importancia aquí, ya que 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 realmente la diferencia. Hice esto, ya que necesito la codificación para algo, que no está relacionado con la URL/URI.
-Eso significa que ambos pueden decodificar caracteres alfanuméricos, aunque no los hayan codificado. Sin embargo...
Aunque la codificación deURIComponente no codifica todos los caracteres, la decodificación deURIComponente puede decodificar cualquier valor entre %00 y %7F.
Nota: Parece que si intentas decodificar un valor superior a %7F (a menos que sea un valor unicode), tu guión fallará con un error "URI".
...y la de los demás;
encodeURIComponent()
...y la de los demás;
...y no se puede hacer nada más;
Convierte la entrada en una URL codificada
; cuerda
...y la de los demás;
...y no se puede hacer nada más;
encodeURI()
...y la de los demás;
...y no se puede hacer nada más;
La URL codifica la entrada, pero
...y la de los demás;
asume que se da un URL completo, así que
...y la de los demás;
devuelve un URL válido al no codificar
...y la de los demás;
el protocolo (por ejemplo.
http://) y
...y la de los demás;
nombre del anfitrión (por ejemplo
...y el nombre del anfitrión (por ejemplo..;
www.stackoverflow.com).
decodeURIComponente()
y decodeURI()
son lo opuesto a lo anterior
codificadoURIComponente No escapó:
A-Z a-z 0-9 - _ . ! ~ * ' ( )
codificaURI() No escapó:
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