¿Cuál es la diferencia entre las funciones de JavaScript decodeURIComponent
y decodeURI
?¿Cuál es la diferencia entre decodeURIComponent y decodeURI?
Respuesta
Para explicar la diferencia entre estos dos, permítanme explicar la diferencia entre encodeURI y encodeURIComponent.
La diferencia principal es que:
- encodeURI está diseñada para uso en la URI completa.
- encodeURIComponent está destinado a ser utilizado en .. .. bien componentes URI que es cualquier parte que se encuentra entre los separadores (; /?: @ & = + $, #).
Por lo tanto, en encodeURIComponent estos separadores también se codifican porque se consideran texto y no como caracteres especiales.
Ahora, volviendo a la diferencia entre las funciones de decodificación, cada función decodifica cadenas generadas por su contraparte de codificación correspondiente, teniendo en cuenta la semántica de los caracteres especiales y su manejo.
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 "seguro" URI por espacios codifican y algunos otros (por ejemplo no imprimibles) caracteres, mientras que encodeURIComponent
codifica adicionalmente el colon y roza y más caracteres, y está destinado a ser utilizado en las cadenas de consulta. La codificación de + y? y & es de particular importancia aquí, ya que estos son caracteres especiales en cadenas de consulta.
decodeURIComponent decodificará marcadores especiales URI como &,?, #, Etc, decodeURI no lo hará.
encodeURIComponent()
convierte la entrada en un cadena con codificación URL
encodeURI()
URL-codifica la entrada, pero asume se le da un URL completo, por lo devuelve una URL válida al no codificar el protocolo (p.ej. http: //) y nombre de host (por ejemplo, www.stackoverflow.com).
decodeURIComponent()
y decodeURI()
son lo contrario de lo anterior
encodeURIComponent/decodeURIComponent() es casi siempre el par que desea utilizar, para concatenar juntos y fragmentarse cadenas de texto en partes URI.
encodeURI en menos común, y con un nombre engañoso: realmente se debería llamar fixBrokenURI. Se necesita 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 en la reparación de 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% UF-8 oculto para codificar el no ASCII)
decodeURI decodifica los mismos caracteres que decodeURIComponent a excepción de algunos especiales. Se proporciona para ser un inverso de encodeURI, pero todavía no puede contar con que devuelva lo mismo que originalmente: vea, por ejemplo. decodeURI(encodeURI('%20 '));
.
Donde encodeURI realmente debería llamarse fixBrokenURI(), decodeURI() podría llamarse potencialmenteBreakMyPreviouslyWorkingURI(). No puedo pensar en un uso válido para él en ningún lado; evitar.
decodeURI (encodeURI ('% 20')) da '% 20' correctamente en es decir, cromo y firefox, preguntándose de qué navegador/versión es incorrecto resultado que observó? – ccppjava
Podría haberse roto en 2009, pero el navegador moderno se puso al mismo tiempo (supongo). – WoodrowShigeru
Como tenía la misma pregunta, pero no encontré la respuesta aquí, hice algunas pruebas para descubrir cuál es realmente la diferencia. Lo hice, ya que necesito la codificación de algo, que no está relacionado con URL/URI.
encodeURIComponent("A")
devuelve "A", que no codifica "A" a "% 41"decodeURIComponent("%41")
devuelve "A".encodeURI("A")
devuelve "A", que no codifica "A" a "% 41"decodeURI("%41")
devuelve "A".
-Esto significa que ambos pueden decodificar caracteres alfanuméricos, aunque no los codificaron. 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 script fallará con un "error de URI".
Nota: Hay un error tipográfico en el primer decodificador del decodificador (m en lugar de n). No puedo corregirlo, porque tengo que editar al menos 6 caracteres. – SuperNova
- 1. ¿Cuál es la diferencia entre {0} y ""?
- 2. Cuál es la diferencia entre = y: =
- 3. ¿Cuál es la diferencia entre .ToString (+) y ""
- 4. Cuál es la diferencia entre $ (...) y `...`
- 5. ¿cuál es la diferencia entre:.! y: r !?
- 6. ¿Cuál es la diferencia entre ".equals" y "=="?
- 7. ¿Cuál es la diferencia entre dict() y {}?
- 8. ¿Cuál es la diferencia entre `##` y `hashCode`?
- 9. ¿Cuál es la diferencia entre "$^N" y "$ +"?
- 10. ¿Cuál es la diferencia entre [indefinido] y [,]?
- 11. ¿Cuál es la diferencia entre + = y = +?
- 12. ¿Cuál es la diferencia entre " " y ""?
- 13. Cuál es la diferencia entre $ y jQuery
- 14. OpenGL (ES) - ¿Cuál es la diferencia entre frustum y orto?
- 15. Cuál es la diferencia entre la función() {}() y la función() {}()
- 16. ¿Cuál es la diferencia entre la abstracción y la encapsulación?
- 17. ¿Cuál es la diferencia entre @ y $ y% en MSBuild?
- 18. ¿Cuál es la diferencia entre la vinculación estática y dinámica?
- 19. ¿Cuál es la diferencia entre la sección .got y .got.plt?
- 20. ¿Cuál es la diferencia entre el colado y la coerción?
- 21. ¿cuál es la diferencia entre el complemento y la biblioteca?
- 22. ¿Cuál es la diferencia entre el casting y la conversión?
- 23. ¿Cuál es la diferencia entre WPF y la aplicación Silverlight?
- 24. ¿Cuál es la diferencia entre uno mismo y la ventana?
- 25. ¿Cuál es la diferencia entre CookieContainer y la colección Response.Cookies?
- 26. ¿Cuál es la diferencia entre la relación Composición y Asociación?
- 27. ¿cuál es la diferencia entre el material y la textura?
- 28. ¿Cuál es la diferencia entre el marco y la arquitectura?
- 29. ¿Cuál es la diferencia entre la carpeta vim72 y vimfiles?
- 30. ¿cuál es la diferencia entre la lex y yacc
Otra diferencia fundamental es que unescape no maneja secuencias UTF-8 multibyte, mientras que decodeURI [Component] hace: 'decodeURIComponent ("% C3% A9 ") ==" é "; unescape ("% C3% A9") == "Ã" ";' – chris