Você não deve usar encodeURIComponent()
ou encodeURI()
. Você deve usar fixedEncodeURIComponent()
e fixedEncodeURI()
, de acordo com a Documentação MDN.
Em relação encodeURI()
...
Se alguém deseja seguir o RFC3986 mais recente para URLs, que torna os colchetes reservados (para IPv6) e, portanto, não codificados ao formar algo que poderia ser parte de um URL (como um host), o seguinte snippet de código pode ajudar:
function fixedEncodeURI(str) {
return encodeURI(str).replace(/%5B/g, '[').replace(/%5D/g, ']');
}
Em relação encodeURIComponent()
...
Para ser mais rigoroso na adesão ao RFC 3986 (que reserva!, ', (,) E *), embora esses caracteres não tenham usos de delimitação de URI formalizados, o seguinte pode ser usado com segurança:
function fixedEncodeURIComponent(str) {
return encodeURIComponent(str).replace(/[!'()*]/g, function(c) {
return '%' + c.charCodeAt(0).toString(16);
});
}
Então qual é a diferença? fixedEncodeURI()
e fixedEncodeURIComponent()
converter o mesmo conjunto de valores, mas fixedEncodeURIComponent()
também converte este conjunto: +@?=:*#;,$&
. Este conjunto é utilizado em GET
parâmetros ( &
, +
, etc.), marcas de âncora ( #
), etiquetas curinga ( *
), peças de e-mail / nome de usuário ( @
), etc ..
Por exemplo - Se você usar encodeURI()
, user@example.com/?email=me@home
não enviará corretamente o segundo @
para o servidor, exceto para o seu navegador lidar com a compatibilidade (como o Chrome naturalmente faz com frequência).