¿Cuál es la diferencia entre decodeURIComponent y decodeURI?

363

¿Cuál es la diferencia entre las funciones de JavaScript decodeURIComponenty decodeURI?

Jon Tackabury
fuente

Respuestas:

398

Para explicar la diferencia entre estos dos, permítanme explicar la diferencia entre encodeURIy encodeURIComponent.

La principal diferencia es que:

  • La encodeURIfunción está diseñada para usarse en el URI completo.
  • La encodeURIComponentfunción está destinada a ser utilizada en ... bueno ... componentes URI que es cualquier parte que se encuentra entre los separadores (; /?: @ & = + $, #).

Entonces, en encodeURIComponentestos 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.

MahdeTo
fuente
44
Otra diferencia vital es que unescape no maneja secuencias UTF-8 de varios bytes, mientras que decodeURI [Componente] sí:decodeURIComponent("%C3%A9") == "é"; unescape("%C3%A9") == "é";
chris
En mi humilde opinión, dar algunos ejemplos sería muy útil
Transang
114

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.

bobince
fuente
11
decodeURI (encodeURI ('% 20')) da '% 20' correctamente, es decir, en Chrome y Firefox, ¿solo se pregunta desde qué navegador / versión obtuvo el resultado incorrecto?
ccppjava
1
Podría haberse roto en 2009, pero el navegador moderno se puso al día mientras tanto (supongo).
WoodrowShigeru
68
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 encodeURIproduce un URI "seguro" al codificar espacios y algunos otros caracteres (por ejemplo, no imprimibles), mientras que encodeURIComponentadicionalmente 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.

Jason S
fuente
30

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

Kul-Tigin
fuente
Nota: Hay un error tipográfico en el primer decodeURIComponent (m en lugar de n). No puedo corregirlo, porque tengo que editar al menos 6 caracteres.
SuperNova
23

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

Russ Cam
fuente
12

decodeURIComponent decodificará marcadores especiales URI tales como &,?, #, etc., decodeURI no lo hará.

Bjorn
fuente