Qual é a diferença entre as funções JavaScript decodeURIComponent
e decodeURI
?
Qual é a diferença entre as funções JavaScript decodeURIComponent
e decodeURI
?
Respostas:
Para explicar a diferença entre esses dois, deixe-me explicar a diferença entre encodeURI
e encodeURIComponent
.
A principal diferença é que:
encodeURI
função deve ser usada no URI completo.encodeURIComponent
função deve ser usada em .. bem .. componentes URI que são qualquer parte que se encontra entre separadores (; /?: @ & = + $, #).Portanto, encodeURIComponent
esses separadores também são codificados porque são considerados como texto e não como caracteres especiais.
Agora, voltando à diferença entre as funções de decodificação, cada função decodifica seqüências de caracteres geradas por sua contraparte de codificação correspondente, cuidando da semântica dos caracteres especiais e seu tratamento.
encodeURIComponent / decodeURIComponent () é quase sempre o par que você deseja usar, para concatenar e dividir seqüências de texto em partes de URI.
encodeURI em menos comum e com um nome enganador: deve realmente ser chamado fixBrokenURI. Ele pega algo que é quase um URI, mas possui caracteres inválidos, como espaços, e o transforma em um URI real. Ele tem um uso válido na correção de URIs inválidos da entrada do usuário e também pode ser usado para transformar um IRI (URI com caracteres Unicode nus) em um URI simples (usando UTF-8 com% de escape para codificar o não ASCII )
decodeURI decodifica os mesmos caracteres que decodeURIComponent, com exceção de alguns caracteres especiais. Ele é fornecido para ser um inverso do encodeURI, mas você ainda não pode contar com ele para retornar o mesmo que originalmente colocou - veja, por exemplo. decodeURI(encodeURI('%20 '));
.
Onde encodeURI deveria realmente ser chamado fixBrokenURI (), decodeURI () poderia igualmente ser chamado potencialmenteBreakMyPreviouslyWorkingURI (). Não consigo pensar em nenhum uso válido para isso em nenhum lugar; 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
produz um URI "seguro" codificando espaços e outros caracteres (por exemplo, não imprimíveis), enquanto encodeURIComponent
codifica adicionalmente os dois pontos e os caracteres de barra e mais, e deve ser usado em cadeias de caracteres de consulta. A codificação de + e? e & é de particular importância aqui, pois esses são caracteres especiais nas cadeias de consulta.
Como eu tinha a mesma pergunta, mas não encontrei a resposta aqui, fiz alguns testes para descobrir qual é realmente a diferença. Fiz isso, pois preciso da codificação para algo que não esteja relacionado a URL / URI.
encodeURIComponent("A")
retorna "A", não codifica "A" para "% 41"decodeURIComponent("%41")
retorna "A".encodeURI("A")
retorna "A", não codifica "A" para "% 41"decodeURI("%41")
retorna "A".-Isso significa que ambos podem decodificar caracteres alfanuméricos, mesmo que não os tenham codificado. Contudo...
encodeURIComponent("&")
retorna "% 26".decodeURIComponent("%26")
retorna "&".encodeURI("&")
retorna "&".decodeURI("%26")
retorna "% 26".Mesmo que encodeURIComponent não codifique todos os caracteres, decodeURIComponent pode decodificar qualquer valor entre% 00 e% 7F.
Nota: Parece que se você tentar decodificar um valor acima de% 7F (a menos que seja um valor unicode), seu script falhará com um "erro de URI".
encodeURIComponent()
Converte a entrada em uma sequência de caracteres codificada em URL
encodeURI()
O URL codifica a entrada, mas assume que um URL completo é fornecido, portanto, retorna um URL válido, não codificando o protocolo (por exemplo, http: // ) e o nome do host (por exemplo, www.stackoverflow.com ).
decodeURIComponent()
e decodeURI()
são o oposto do acima
encodeURIComponent Not Escaped:
A-Z a-z 0-9 - _ . ! ~ * ' ( )
encodeURI () sem escape:
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
decodeURIComponent("%C3%A9") == "é"; unescape("%C3%A9") == "é";