Como usar o codificador e decodificador de URL
- Escolha Codificar ou Decodificar.
- Escolha um modo: componente, para um único valor de consulta ou segmento de caminho, ou URL completa, para manter intacta a estrutura da URL (
:,/,?,&). - Cole o seu texto ou a URL e copie o resultado.
Tudo é processado no seu navegador. As URLs costumam carregar tokens e dados pessoais nas query strings, e nada disso é enviado nem armazenado.
O que é a codificação por porcentagem?
As URLs só podem conter um conjunto limitado de caracteres ASCII. A codificação por porcentagem (percent-encoding), definida na RFC 3986, representa qualquer outro byte como um sinal de porcentagem seguido de dois dígitos hexadecimais. O texto é primeiro convertido em bytes UTF-8 e, depois, cada byte que precisa de escape é escrito como %XX:
café & crème → caf%C3%A9%20%26%20cr%C3%A8me
Aqui, é são dois bytes UTF-8 (C3 A9), o espaço vira %20 e o e comercial vira %26.
Caracteres reservados e não reservados
| Grupo | Caracteres | Significado |
|---|---|---|
| Não reservados | A–Z a–z 0–9 - . _ ~ | Nunca precisam de codificação. |
| Reservados: gen-delims | : / ? # [ ] @ | Separam as partes principais de uma URL. |
| Reservados: sub-delims | ! $ & ' ( ) * + , ; = | Delimitam dados dentro de uma parte, como & e = nas query strings. |
Os caracteres reservados devem ser codificados quando aparecem como dados e não como delimitadores. Uma busca por R&D precisa ser enviada como q=R%26D; caso contrário, o servidor vê um segundo parâmetro chamado D.
encodeURIComponent x encodeURI
O JavaScript oferece duas funções, e escolher a errada é uma fonte frequente de bugs:
encodeURIComponent()codifica tudo, excetoA–Z a–z 0–9 - _ . ! ~ * ' ( ). Use-a para valores individuais: parâmetros de consulta, segmentos de caminho, dados de fragmento.encodeURI()deixa intactos também; , / ? : @ & = + $ #, de modo que pode ser aplicada a uma URL completa sem quebrar a estrutura dela. Ela não protege um valor que contenha&ou#.
encodeURI("https://example.com/a b?q=R&D")
// "https://example.com/a%20b?q=R&D" (o & fica intacto)
"https://example.com/search?q=" + encodeURIComponent("R&D")
// "https://example.com/search?q=R%26D"
Melhor ainda: deixe o URLSearchParams ou a biblioteca de URL da sua linguagem montar as query strings para você.
Armadilhas comuns
+ versus %20
Formulários HTML enviados como application/x-www-form-urlencoded codificam o espaço como +. Nas URLs da RFC 3986, o + é um sinal de mais literal e o espaço é %20. Um decodificador que não sabe qual convenção foi usada pode transformar C++ em C ou deixar o + no lugar dos espaços. Codifique um sinal de mais de verdade como %2B para ficar seguro.
Python: urllib.parse.quote("a b&c") → a%20b%26c
urllib.parse.quote_plus("a b&c") → a+b%26c
Codificação dupla
Codificar uma string já codificada escapa os próprios sinais de porcentagem: %20 vira %2520. Isso costuma acontecer quando um valor é codificado pelo seu código e de novo por um framework ou cliente HTTP. Se você vir %25 em uma URL, suspeite de codificação dupla. Decodificar duas vezes é igualmente prejudicial: pode transformar um %41 literal em dados do usuário em A.
Codificar a URL inteira como componente
Executar encodeURIComponent em uma URL completa escapa :// e cada /, produzindo https%3A%2F%2F.... Isso só está correto quando a própria URL é um valor de parâmetro, como um redirect_uri.
Dicas
- Os dígitos hexadecimais nas codificações por porcentagem não diferenciam maiúsculas de minúsculas, mas a RFC 3986 recomenda maiúsculas (
%2F, não%2f). - Nomes de domínio internacionalizados não são codificados por porcentagem; eles usam Punycode (
xn--). - Precisa transportar dados binários em uma URL? O Base64 seguro para URLs é mais compacto do que codificar cada byte por porcentagem.
- Inspecione como um servidor trata a sua requisição codificada com o verificador de cabeçalhos HTTP.
Perguntas frequentes
Por que o espaço às vezes é + e às vezes %20?
O + vem da codificação de formulários HTML usada em query strings e corpos de POST; o %20 é a codificação geral da RFC 3986, válida em qualquer parte de uma URL. Na dúvida, use %20.
Quais caracteres nunca precisam de codificação?
O conjunto de não reservados: letras, dígitos, hífen, ponto, sublinhado e til. Todo o resto deve ser codificado quando faz parte de um valor.
A codificação de URL é uma medida de segurança?
Não. Ela apenas torna os dados sintaticamente seguros dentro de uma URL e é totalmente reversível. Não oculta dados nem impede injeção por si só.
Como decodifico uma URL com sequências %uXXXX?
%uXXXX é um formato não padrão produzido pela função escape() do JavaScript, já obsoleta. Os decodificadores padrão o rejeitam; ele precisa ser convertido separadamente.
Atualizado