Por que URLs precisam ser codificadas
Uma URL só pode ter um conjunto limitado de caracteres ASCII, e alguns deles têm funções: / separa trechos do caminho, ? começa a query, & e = separam parâmetros, # começa o fragmento. Para colocar um espaço, uma letra acentuada ou um & literal dentro de um valor, o caractere é trocado por % seguido dos seus bytes UTF-8 em hexadecimal. Um espaço vira %20, ç (dois bytes em UTF-8) vira %C3%A7 e & vira %26.
Use o escopo componente para um pedaço só, como o termo de busca em ?q= ou um nome de arquivo no caminho. Use URL inteira quando tiver um endereço completo com caracteres inseguros dentro e quiser manter a estrutura.
Exemplo resolvido
A busca pão de queijo & café numa query string precisa ser enviada como p%C3%A3o%20de%20queijo%20%26%20caf%C3%A9; sem codificar, o servidor veria o & como início de outro parâmetro. A URL https://exemplo.com.br/cardápio 2026.pdf vira https://exemplo.com.br/card%C3%A1pio%202026.pdf.
Como funciona
O escopo componente escapa todos os caracteres exceto o conjunto não reservado A–Z a–z 0–9 - . _ ~ da RFC 3986 §2.3, depois de codificar o texto em UTF-8. Ele equivale ao encodeURIComponent do JavaScript, mas também escapa ! ' ( ) *, que a RFC 3986 reserva. O escopo URL inteira equivale ao encodeURI e mantém os delimitadores : / ? # [ ] @ & = + $ ,. Espaços viram %20; a convenção do + vale só para formulários HTML. Tudo roda nesta aba.
Perguntas frequentes
Espaço vira %20 ou +?
Em URLs, %20. A forma com + só existe para envio de formulários HTML (application/x-www-form-urlencoded). Os decodificadores do site aceitam as duas.
Qual a diferença entre os dois escopos?
Componente escapa tudo que tem significado em URLs, inclusive / ? & =. URL inteira mantém esses delimitadores para o endereço continuar funcionando.
Por que meu texto foi codificado duas vezes (%2520)?
A entrada já estava codificada, então os sinais de % foram escapados de novo. Decodifique antes.
Quais caracteres nunca são codificados?
Letras A–Z e a–z, dígitos 0–9 e os quatro símbolos - . _ ~ (caracteres não reservados da RFC 3986).
Fontes
- RFC 3986 — Uniform Resource Identifier (URI): Generic Syntax
- ECMA-262 — ECMAScript Language Specification
- Wikipedia — Percent-encoding
Revisado em 17 de out. de 2026 · vetores de teste fixtures/dev/url-encode/