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 GETparâ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@homenã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).