javascript - online - ¿Cuál es la diferencia entre decodeURIComponent y decodeURI?
js encode decode (7)
¿Cuál es la diferencia entre las funciones de JavaScript decodeURIComponent
y decodeURI
?
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 del host (por ejemplo, www..com ).
decodeURIComponent()
y decodeURI()
son lo opuesto a lo anterior
Como tenía la misma pregunta, pero no encontré la respuesta aquí, hice algunas pruebas para descubrir cuál es realmente la diferencia. Hice esto, ya que necesito la codificación de algo, que no está relacionada con la 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")
devuelve "&". -
encodeURI("&")
devuelve "&". -
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 por encima de% 7F (a menos que sea un valor Unicode), su secuencia de comandos fallará con un "error de URI".
Para explicar la diferencia entre estos dos, permítanme explicar la diferencia entre encodeURI y encodeURIComponent.
La principal diferencia es que:
- encodeURI está diseñado para su uso en el URI completo.
- encodeURIComponent está diseñado para ser usado en ... bueno ... componentes URI que es cualquier parte que se encuentra entre los separadores (; /?: @ & = + $, #).
Por lo tanto, en encodeURIComponent estos separadores también están codificados 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 homólogo de codificación correspondiente, cuidando la semántica de los caracteres especiales y su manejo.
decodeURIComponent decodificará marcadores especiales URI como &,?, #, etc., decodeURI no.
encodeURIComponent / decodeURIComponent () es casi siempre el par que desea usar, para concatenar y separar 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 a partir de la entrada del usuario, y también se puede usar para convertir un IRI (URI con caracteres Unicode desnudos en) en un URI simple (usando% -escaped UTF-8 para codificar lo no ASCII) ).
decodeURI decodifica los mismos caracteres que decodeURIComponent a excepción de unos pocos especiales. Se proporciona para que sea una inversa de encodeURI, pero aún no puede contar con él para que devuelva lo mismo que originalmente colocó - vea por ejemplo. decodeURI(encodeURI(''%20 ''));
.
Donde encodeURI realmente debería llamarse fixBrokenURI (), a decodeURI () también se le podría llamar potencialmente BreakMyPreviouslyWorkingURI (). No se me ocurre ningún uso válido para ello en ninguna parte; evitar.
encodeURIComponent no escapado:
A-Z a-z 0-9 - _ . ! ~ * '' ( )
encodeURI () no escapado:
A-Z a-z 0-9 ; , / ? : @ & = + $ - _ . ! ~ * '' ( ) #
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" mediante la codificación de espacios y algunos otros caracteres (por ejemplo, no imprimibles), mientras que encodeURIComponent
codifica adicionalmente los caracteres de dos puntos, barra diagonal y 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 cadenas de consulta.