Como decodificar uma URL
- Cole o link ou o trecho codificado na caixa — por exemplo
p%C3%A3o%20de%20queijo. O texto legível aparece na hora. - Se for uma URL completa, você também vê as partes: protocolo, domínio (inclusive a forma Unicode de domínios com acento), caminho, fragmento depois do # e uma tabela com cada parâmetro da query string já decodificado.
- Deixe “Ler + como espaço” marcado para links de busca e dados de formulário, onde o + significa espaço. Desmarque para outros textos, em que + é só o sinal de mais.
- Para codificar, escolha Codificar, digite o texto e diga como: parte de uma URL (o normal para o valor de um parâmetro), URL inteira, dados de formulário ou RFC 3986 estrita.
- Toque em Copiar ao lado do resultado. Se houver um % que não forma um código válido, a página mostra a posição dele.
Por que os links ficam cheios de %
Uma URL só pode ter um conjunto pequeno de caracteres ASCII, e vários deles têm função: / separa o caminho, ? abre a query string, & e = separam os parâmetros e # abre o fragmento. Qualquer outro caractere — e qualquer um desses usado como dado — vira um sinal de porcentagem seguido de dois dígitos hexadecimais, o valor de um byte. Isso é a codificação por porcentagem (percent-encoding), definida na RFC 3986.
O espaço é o byte 32, que em hexadecimal é 20, por isso vira %20. Letras fora do ASCII primeiro são convertidas nos seus bytes UTF-8, e cada byte ganha o seu código. É por isso que o português “engorda” tanto nos links: o ç são dois bytes e vira %C3%A7, o ã vira %C3%A3, e “São Paulo & Rio” vira S%C3%A3o%20Paulo%20%26%20Rio. Decodificar faz o caminho de volta: cada código vira byte de novo e os bytes são lidos como texto UTF-8. Letras sem acento, números e - . _ ~ nunca precisam ser codificados.
Exemplo: um link de loja virtual
O exemplo da caixa é um link de busca como os que circulam no WhatsApp e em campanhas com UTM:
https://www.exemplo.com.br/busca?q=p%C3%A3o+de+queijo&cidade=S%C3%A3o%20Paulo&cupom=FRETE%2BGR%C3%81TIS&volta=%2Fcarrinho%3Fetapa%3D2#avaliacoes
Ele tem 11 códigos % em uma única camada. Decodificado, fica assim:
https://www.exemplo.com.br/busca?q=pão de queijo&cidade=São Paulo&cupom=FRETE+GRÁTIS&volta=/carrinho?etapa=2#avaliacoes
A tabela de parâmetros mostra 4 itens: q = “pão de queijo”, cidade = “São Paulo”, cupom = “FRETE+GRÁTIS”, volta = “/carrinho?etapa=2”. Repare em três detalhes. Em q, os + viraram espaços, porque em query string o + significa espaço. Em cupom, o %2B virou um + de verdade — é assim que se manda um sinal de mais dentro de um parâmetro. E o último valor é ele mesmo um caminho com query string; por isso a /, o ? e o = foram codificados: soltos, o = encerraria o parâmetro antes da hora. O fragmento, #avaliacoes, nunca é enviado ao servidor.
encodeURIComponent, encodeURI ou formulário?
As quatro formas de codificar diferem nos caracteres que deixam como estão:
| Caractere | Parte de uma URL | URL inteira | Formulário | RFC 3986 estrita | |
|---|---|---|---|---|---|
| espaço | %20 | %20 | + | %20 |
& | e comercial | %26 | & | %26 | %26 |
+ | mais | %2B | + | %2B | %2B |
/ | barra | %2F | / | %2F | %2F |
= | igual | %3D | = | %3D | %3D |
? | interrogação | %3F | ? | %3F | %3F |
# | cerquilha | %23 | # | %23 | %23 |
ç | c cedilha | %C3%A7 | %C3%A7 | %C3%A7 | %C3%A7 |
ã | a com til | %C3%A3 | %C3%A3 | %C3%A3 | %C3%A3 |
€ | euro | %E2%82%AC | %E2%82%AC | %E2%82%AC | %E2%82%AC |
- Parte de uma URL é o
encodeURIComponentdo JavaScript: codifica tudo que tem significado numa URL, então o resultado pode ir como valor de um parâmetro — inclusive uma URL inteira dentro de outra, como no parâmetro de redirecionamento. - URL inteira é o
encodeURI: mantém; , / ? : @ & = + $ #para o endereço continuar funcionando. Use para limpar espaços e acentos de um link, nunca para um valor que possa conter &. - Formulário é como o navegador envia um formulário (
application/x-www-form-urlencoded): espaço vira +, como em?q=pao+de+queijo. - RFC 3986 estrita também codifica
! ' ( ) *, o que assinaturas OAuth e algumas APIs exigem.
Acentos quebrados: ISO-8859-1, “São Paulo” e dupla codificação
- Sistemas antigos em ISO-8859-1. Muito sistema brasileiro antigo — ERPs, sites em ASP clássico ou PHP antigo — gravava texto em Latin-1 (ISO-8859-1, que os navegadores leem como Windows-1252) em vez de UTF-8. Nesse caso o ã é um byte só:
S%E3o%20Paulo. Esses bytes não são UTF-8 válido, então a página tenta o Windows-1252, mostra “São Paulo” e avisa qual conjunto de caracteres usou. - “São Paulo” no lugar de “São Paulo” é o contrário: texto em UTF-8 que algum programa leu como Latin-1. Decodificar aqui os códigos originais (
S%C3%A3o) devolve a letra certa. - Dupla codificação. Quando um link já codificado passa por outro sistema que codifica de novo, cada % vira
%25:a%25C3%25A7%25C3%25A3o. A página continua decodificando enquanto sobram códigos e diz quantas camadas havia — neste caso 2, até chegar em “ação”. Desmarque a opção para desfazer uma camada por vez. - Um % solto, como em “50% off”, não é um código e não dá para decodificar. A mensagem aponta a posição; o próprio sinal de porcentagem se escreve
%25.
Domínios .br com acento
O Registro.br aceita domínios com acentos e ç, e eles viajam pela internet numa forma ASCII chamada Punycode (RFC 3492), marcada por xn--. açaí.com.br, por exemplo, é enviado como xn--aa-4iaz.com.br. Cole qualquer uma das formas: a página mostra o domínio como o navegador envia e em Unicode. Punycode não é codificação por porcentagem, então um domínio nunca deve aparecer com códigos %.
Dicas
- Codifique cada valor de parâmetro separadamente e só depois junte tudo com
&e=. Codificar a query string pronta com encodeURIComponent estraga os separadores. - Codificação por porcentagem não é criptografia: qualquer pessoa decodifica. Não coloque senhas, tokens nem CPF em links que você compartilha.
- Para transformar um link num código para escanear, use o gerador de QR Code; para ler um JSON que veio dentro de um parâmetro, o formatador de JSON.
A decodificação e a codificação rodam no seu navegador: nada do que você cola é enviado nem salvo, e recarregar a página limpa a caixa. Links costumam carregar tokens de sessão e dados pessoais, então isso faz diferença.
Perguntas frequentes
O que significa %20 num link?
É um espaço codificado: 20 é o valor hexadecimal do caractere de espaço. Cole o link aqui e todos os códigos voltam a ser texto legível.
Por que o meu link tem %C3%A7 e %C3%A3?
São o ç e o ã em UTF-8, que ocupam dois bytes cada; cada byte vira um código %. Decodificando, as letras com acento voltam ao lugar.
Por que aparece %2520 na URL?
O link foi codificado duas vezes. Na primeira, o espaço virou %20; na segunda, o próprio % virou %25. A página detecta e desfaz todas as camadas.
Qual a diferença entre encodeURI e encodeURIComponent?
O encodeURI codifica uma URL inteira e mantém os caracteres que dão estrutura a ela, como / ? & = #. O encodeURIComponent codifica um pedaço — o valor de um parâmetro ou um trecho do caminho — e codifica esses caracteres também, para que não quebrem a URL em volta.
O + num link é espaço?
Na query string de formulários e buscas, sim: ?q=pao+de+queijo quer dizer “pao de queijo”. Fora dela, e na codificação da RFC 3986, + é sinal de mais e o espaço é %20. Para mandar um + de verdade num parâmetro, use %2B.
O link que eu colo é enviado para algum lugar?
Não. A página decodifica e codifica com JavaScript no seu navegador, sem mandar nada a um servidor, e não guarda o que você cola.
Última atualização: 16 de outubro de 2026