Codificar e decodificar URL

RSS

Codifique texto com percent-encoding para URLs e query strings, ou decodifique URLs codificadas no estilo %20 de volta para texto legível.

Funciona 100% no seu navegador. Nada do que você cola é enviado ou armazenado.
Texto ou URL codificada
Resultado
Pronto.

Como usar o codificador e decodificador de URL

  1. Escolha Codificar ou Decodificar.
  2. Escolha um modo: componente, para um único valor de consulta ou segmento de caminho, ou URL completa, para manter intacta a estrutura da URL (:, /, ?, &).
  3. 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

GrupoCaracteresSignificado
Não reservadosA–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, exceto A–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

Copiado para a área de transferência