O que significam « codificar » e « decodificar » uma URL?
Codificar uma URL (« url encode », « urlencode ») transforma cada caractere proibido em um endereço — espaço, acento, sinal de e comercial, sinal de mais — em uma sequência composta por um sinal de percentual seguido dos dois dígitos hexadecimais do seu byte. Decodificar uma URL (« url decode », « decoder url ») lê essas sequências ao contrário: os bytes são reconstituídos e convertidos em caracteres conforme a codificação declarada, normalmente UTF-8. É exatamente esse par que as pessoas procuram quando digitam « encoder decoder url » ou « percent encoding online ».
O percent-encoding não é compressão nem criptografia: uma palavra acentuada fica duas vezes mais longa e qualquer um pode lê-la a olho. Seu único papel é fazer qualquer byte passar em uma URL, que por padrão só permite um subconjunto de ASCII. Já o Base64 serve para transportar bytes em canais totalmente textuais — os dois se parecem visualmente, mas não são intercambiáveis.
Como codificar uma URL em percent-encoding
Etapa 1: o texto é convertido em bytes conforme o conjunto de caracteres escolhido, UTF-8 por padrão. Etapa 2: para cada byte, verifica-se se o caractere correspondente pertence à lista de caracteres permitidos para o escopo selecionado. Etapa 3: se fizer parte, é copiado como está; caso contrário, vira %XX, com XX sendo os dois dígitos hexadecimais do byte. Etapa 4: se a opção espaço em + estiver ativa, o byte 32 é substituído por um sinal de mais em vez de %20.
Exemplo concreto: « café & été » no escopo componente dá caf%C3%A9%20%26%20%C3%A9t%C3%A9. Basta digitar esse texto no codificador: o resultado, o tamanho de entrada, o tamanho de saída e o acréscimo aparecem antes mesmo de você soltar a tecla.
Os quatro escopos de codificação
O escopo componente preserva apenas letras, dígitos e - _ . ! ~ * ' ( ) : é o escopo do valor de um parâmetro, e corresponde a encodeURIComponent. A string de consulta preserva ainda os sinais de e comercial e os de igualdade, para reconstruir uma query string inteira. O segmento de caminho permite / : @ & = + $ , ; para não quebrar as barras. A URL completa acrescenta ainda ?, #, [ e ] : quase nada é escapado, apenas espaços e caracteres não ASCII viram %XX.
Como decodificar uma URL codificada
A decodificação percorre a string da esquerda para a direita: um sinal de percentual seguido de dois dígitos hexadecimais forma um byte, e qualquer outro caractere é copiado após a conversão conforme a codificação escolhida. Os bytes são depois agrupados e transformados em caracteres — dois bytes para « é », três para « 日 », quatro para um emoji. A aba « Decodificar » mostra cada sequência encontrada, sua posição na string, seus bytes e o texto correspondente.
Se o sinal de percentual não for seguido de dois dígitos válidos, o erro é explícito: sequência incompleta ou caractere hexadecimal inválido. O botão « Corrigir os % » transforma os percentuais isolados em %25, o que torna a string decodificável sem perder informação — a opção mais segura para tratar uma URL parcialmente escapada.
Espaço: %20 ou + — a regra dos formulários
%20 é o espaço em percent-encoding estrito: funciona no caminho, na consulta, no fragmento e nos cabeçalhos. O sinal +, por sua vez, só é espaço no formato application/x-www-form-urlencoded usado pelos formulários HTML e, historicamente, pelas query strings. Em outros lugares ele continua sendo um sinal de mais literal — e como é muito fácil de confundi-lo, é preciso escapá-lo como %2B assim que se codifica um valor.
Na prática: para preencher um campo de formulário ou reproduzir o comportamento de um <form>, marque « Espaço em + ». Para uma URL de redirecionamento, uma canonical ou um link compartilhado, prefira sempre %20. O decodificador, por sua vez, trata + como um espaço por padrão e você pode desativar esse comportamento com um clique.
RFC 3986: unreserved, sub-delims e gen-delims
A RFC 3986 divide os caracteres ASCII em três categorias. Os caracteres não reservados — letras, dígitos, - _ . ~ — são sempre preservados como estão. Os subdelimitadores ! $ & ' ( ) * + , ; = e os delimitadores genéricos : / ? # [ ] @ têm significado estrutural: separam a autoridade, o caminho, a consulta e o fragmento. Todo o resto — espaço, aspas, sinais de menor e maior, chaves e o sinal de percentual — deve ser codificado.
Essas categorias são exatamente as que a aba « RFC 3986 & referência » mostra caractere a caractere: clique em um bloco para ver seu código hexadecimal, sua categoria e os escopos que o preservam. É a referência mais rápida para responder à pergunta « preciso escapar este caractere? ».
Caracteres acentuados, emojis e UTF-8
Uma URL transporta apenas bytes ASCII seguros, então todo caractere acima de U+007F deve ser codificado. Em UTF-8, « é » vale C3 A9 e vira %C3%A9, « 日 » vale três bytes e produz três sequências, um emoji ocupa quatro e se divide em oito caracteres codificados. Se o resultado lhe parece longo, não é um bug: é o preço da compatibilidade com todos os protocolos. Cuidado também com o conjunto de caracteres de origem: decodificar em UTF-8 uma string codificada em Latin-1 produz caracteres aberrantes — daí as quatro opções oferecidas na aba « Decodificar ».
Por que encodeURIComponent nem sempre basta
encodeURIComponent codifica tudo, exceto A-Z a-z 0-9 - _ . ! ~ * ' ( ), o que serve para o valor de um parâmetro, mas quebra uma URL completa, pois também escapa as barras, os dois-pontos e os sinais de e comercial. encodeURI faz o contrário: preserva a estrutura da URL, mas deixa passar espaços e acentos, então falha em texto puro. Os dois comportamentos são cobertos aqui — e muito mais, pois o escopo « String de consulta » e o escopo « Segmento de caminho » preenchem a lacuna entre os dois.
Percent-encoding e Base64: duas ferramentas diferentes
O percent-encoding substitui byte a byte e preserva a legibilidade do texto original, ao custo de um aumento considerável. O Base64 agrupa os bytes de três em três e os reescreve em um alfabeto de 64 caracteres: compacto, mas totalmente ilegível e inutilizável como está em uma URL sem a variante URL-safe. A aba « Codificações cruzadas » mostra os dois num único relance, com bônus dos bytes hexadecimais, das entidades HTML e da string JSON escapada — tudo para escolher a representação certa antes de copiar qualquer coisa.
Erros frequentes: codificação dupla e % isolado
O erro mais comum é escapar a mesma string duas vezes: um espaço vira %20, depois %2520, e o servidor recebe literalmente « %20 ». O segundo é esquecer o próprio sinal de percentual, que deve virar %25 — senão o decodificador o toma como início de uma sequência e trava ou trunca. Por fim, manter um + não escapado em um parâmetro de formulário equivale a inserir um espaço que você não pediu. O decodificador sinaliza as sequências mal formadas, e o botão « Corrigir os % » conserta o segundo caso sem perdas.
Onde se escondem as URLs codificadas
Nas query strings de rastreamento UTM, nas redirect_uri e nos estados OAuth, nas webhooks cuja URL de destino contém parâmetros aninhados, nas URLs de callback assinadas, nos logs de servidor, nos sitemaps e nas canonical, nos <a href> gerados no cliente, nos JWT cujo payload está em Base64URL, nos data: e nos cabeçalhos Location, e em qualquer formulário HTML enviado via GET. Saber codificar e decodificar em um segundo evita abrir um terminal para uma única string.
Desempenho e boas práticas
No navegador, a codificação e a decodificação são lineares e não custam nada notável, mesmo em vários megabytes: cada caractere é tratado uma única vez, sem recursão nem alocação por caractere. As únicas armadilhas são a codificação dupla — verifique sempre o round-trip antes de armazenar — e URLs de vários quilobytes, frequentemente truncadas pelos proxies além de 2 000 caracteres. Documente o escopo usado ao lado da string produzida: « componente » e « URL completa » não dão o mesmo resultado no mesmo texto.
Recomendado para
Desenvolvedores back-end e front-end (query strings, redirecionamentos, OAuth), integradores e redatores técnicos (links UTM, canonical, rastreamento), administradoras e DevOps (webhooks, URLs assinadas, logs), testers e pentesters (fuzzing de parâmetros, contorno de filtros), estudantes (entender UTF-8, ASCII e RFC 3986) e qualquer pessoa que precise de um codificador e decodificador URL online rápido, completo e confidencial — complementado pelo codificador e decodificador Base64 e pelo formatador JSON.