Lição 3

encodeURI vs encodeURIComponent

Helpers JavaScript e quando usar em paths vs valores de query.

JavaScript expõe duas funções globais com nomes quase iguais mas conjuntos diferentes de caracteres que deixam sem escape. Ambas tratam texto URI, com escopos de dados diferentes.

encodeURIComponent codifica “um componente só”

Use para valores de query, segmentos de path, identificadores de fragment e qualquer string que não deve injetar estrutura:

encodeURIComponent("a/b?c=1&d=2");
// "a%2Fb%3Fc%3D1%26d%3D2"

Note /, ?, &, = viram escape percentual para o valor permanecer opaco quando embutido.

Padrão típico ao montar query manualmente:

const q = new URLSearchParams({
  title: "Q&A / Notes",
  next: "https://example.com/a?x=1",
});
q.toString(); // title=Q%26A+%2F+Notes&next=https%3A%2F%2Fexample.com%2Fa%3Fx%3D1
// (URLSearchParams usa application/x-www-form-urlencoded; + para espaço)

Para strings montadas à mão, prefira URLSearchParams ou bibliotecas que já tratam separadores.

encodeURI preserva delimitadores URI

encodeURI assume que você passa uma URI quase completa e só precisa corrigir caracteres ilegais globalmente mantendo pontuação estrutural:

encodeURI("https://example.com/résumé?id=1#top");
// https://example.com/r%C3%A9sum%C3%A9?id=1#top

Não codifica ?, #, / quando aparecem — porque acredita que podem ser delimitadores reais. Isso é perigoso se seu “dado” inclui esses símbolos.

encodeURI("https://example.com/search?q=a/b");
// mantém a barra — pode quebrar expectativa do servidor se / era dado, não separador de path

Regra prática: não use encodeURI para proteger texto arbitrário de usuário; use encodeURIComponent (ou APIs de nível superior) por componente.

Guia rápido de decisão

SituaçãoHelper preferido
Segmento de path com / como dadoencodeURIComponent em cada segmento
URL inteira do usuário com delimitadores desconhecidosParse com URL, depois codifique cada parte
URI já estruturalmente correta, só acentos falhamTalvez encodeURI — ainda é mais claro normalizar host/path separado
Montagem repetida de APIsPrefira URL + URLSearchParams, não concatenação

decodeURI vs decodeURIComponent

Cuidados simétricos:

decodeURIComponent("100%2525"); // pode dar "100%25" com uma passagem — cuidado com double-encoding upstream
decodeURI("http://host/%7Euser") → mantém delimitadores e decodifica escapes em outras posições

Se você misturar escopos de encode/decode, texto decodificado pode reintroduzir separadores (&, ?) que mudam o parse de parâmetros — armadilha clássica em open-redirect ou bypass de filtro quando refletido em HTML ou headers.

Voltar à visão geral do curso