2009-04-14 11 views

Respuesta

292

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.

+0

Otra diferencia fundamental es que unescape no maneja secuencias UTF-8 multibyte, mientras que decodeURI [Component] hace: 'decodeURIComponent ("% C3% A9 ") ==" é "; unescape ("% C3% A9") == "Ã" ";' – chris

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

10

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

20

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

89

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.

+8

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

+0

Podría haberse roto en 2009, pero el navegador moderno se puso al mismo tiempo (supongo). – WoodrowShigeru

18

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

+0

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

Cuestiones relacionadas