Desenvolvimento

Codificador e decodificador de URL

Codifique um valor para que ele sobreviva dentro de uma URL, ou decodifique um que chegou ilegível. Se o que você colar tiver uma query string, os parâmetros são separados logo abaixo para você ver o que há de verdade ali.

Codificar um valor usa encodeURIComponent, e codificar uma URL inteira usa encodeURI. Usar a função errada em um endereço completo destrói o endereço.

Opções

As duas valem só para a codificação de um único valor. O modo estrito escapa também ! ' ( ) *, que o OAuth e as assinaturas da AWS exigem.

0Caracteres na entrada
0Caracteres na saída
0Escapes

A codificação percentual em um parágrafo

Uma URL só pode conter um conjunto pequeno de caracteres. Todo o resto é escrito como um sinal de porcentagem seguido dos dois dígitos hexadecimais do seu byte: um espaço é %20, o sinal # é %23. Os caracteres fora do ASCII são convertidos primeiro para UTF-8 e só então escapados byte a byte, então é vira %C3%A9 — dois escapes para um único caractere. Uma ferramenta que em vez disso produz %E9 está usando Latin-1 e vai quebrar com qualquer coisa moderna.

Os caracteres que nunca precisam de escape

A RFC 3986 os chama de não reservados: as letras A–Z e a–z, os dígitos 0–9 e os quatro sinais - . _ ~. Eles significam a mesma coisa escapados ou não, então escapá-los é legal mas inútil, e faz duas URLs idênticas parecerem diferentes para um cache.

Depois vêm os caracteres reservados — / ? # [ ] @ : $ & ' ( ) * + , ; = — que são a pontuação que dá estrutura a uma URL. Se eles precisam de escape ou não depende inteiramente de onde estão. Dentro de um valor, um & solto abre um parâmetro novo e corta os seus dados em silêncio. Na URL em si, ele está fazendo o trabalho dele.

Qual dos dois codificadores você quer

Essa é a distinção que o seletor de modo acima está fazendo, e é a mesma que existe por trás das duas funções do JavaScript:

O sinal de mais é genuinamente ambíguo

No formato application/x-www-form-urlencoded — o que os formulários HTML enviam e, por isso, a cara da maioria das query strings — um espaço é escrito como +. Na RFC 3986, que rege as URLs em geral, + é um sinal de mais literal. Os dois estão corretos no seu próprio contexto, e uma query string não diz qual das duas regras a produziu.

A consequência prática: um número de telefone em uma query string é uma armadilha. ?tel=+44123 chega a muitos servidores como " 44123". Se um valor pode conter um sinal de mais, codifique-o como %2B e pare de confiar em qualquer uma das duas convenções. A tabela de parâmetros acima decodifica + como espaço, porque esse é o caso mais comum, o que significa que ela mostra a coisa errada para valores em que o mais era literal.

A codificação dupla, e por que não dá para desfazê-la de forma confiável

Codifique uma string duas vezes e %20 vira %2520, porque o próprio sinal de porcentagem é escapado. A ferramenta avisa quando vê esse padrão, e quando uma decodificação deixa escapes para trás. O que ela não consegue fazer é dizer se aquilo foi um erro: uma URL que contém o texto literal 100%25 é uma coisa perfeitamente válida de guardar. Quando um dado com codificação dupla chega a um banco de dados, a ambiguidade é permanente.

O que esta ferramenta não resolve

Perguntas frequentes

Qual é a diferença entre encodeURI e encodeURIComponent?

encodeURIComponent escapa também os caracteres estruturais / ? & = #, então ele serve para um único valor. encodeURI deixa esses caracteres em paz para que um endereço inteiro continue utilizável. Usar encodeURI em um dado digitado por uma pessoa é o bug que deixa um valor escapar do seu parâmetro.

Um espaço deve ser %20 ou um sinal de mais?

Os dois aparecem por aí. Envios de formulário usam +, e a RFC 3986 usa %20 e trata o + como um mais literal. %20 é seguro em todo lugar, então prefira-o, e sempre codifique um sinal de mais de verdade como %2B.

Por que um caractere acentuado vira dois escapes?

Porque a codificação percentual trabalha sobre bytes, não sobre caracteres, e o texto é convertido para UTF-8 antes. O e com acento agudo ocupa dois bytes em UTF-8, então vira %C3%A9. Os emojis ocupam quatro bytes e produzem quatro escapes.

Meu texto decodificado ainda tem sinais de porcentagem. O que aconteceu?

Ele foi codificado duas vezes. Mande a saída de volta para a entrada e decodifique de novo. A ferramenta sinaliza isso, mas não consegue provar que a segunda passada foi um erro em vez de texto literal.

Isso funciona para nomes de domínio internacionais?

Não. Nomes de host com caracteres fora do ASCII usam punycode, um algoritmo separado que produz nomes começando com xn--. Escapes percentuais não são válidos de jeito nenhum dentro de um nome de host.

Última atualização 19 de setembro de 2026