My Dev Tools
Codificação

Codificar e decodificar URL

Cole texto ou uma URL codificada: o sentido é detectado sozinho, a função equivalente (encodeURIComponent, encodeURI…) aparece e o erro mostra onde está o % inválido.Roda no seu navegador: nada é enviado
Aguardando texto ou URL codificada.

Como usar

  1. Cole o texto ou a URL codificada no painel Entrada, use o botão Colar, abra um arquivo de texto ou toque em Exemplo.
  2. No sentido Auto a página decide sozinha se codifica ou decodifica e o rodapé explica o motivo (por exemplo, “tem espaços, e texto codificado não tem espaço”). Escolha Codificar ou Decodificar para forçar o sentido.
  3. Escolha o Modo: Componente para o valor de um parâmetro, URL inteira para o endereço todo, Formulário para trocar espaço por + e Estrito para seguir a RFC 3986. O status mostra a função equivalente, como encodeURIComponent ou encodeURI.
  4. Se a entrada tiver um % inválido, a mensagem mostra a linha, a coluna e o que corrigir. Ir para o erro seleciona o trecho exato, e Ler como Latin-1 decodifica links de sites antigos que não usam UTF-8.
  5. Copie ou baixe o resultado no rodapé do painel. Se ele ainda tiver sequências %XX (texto codificado duas vezes), Usar como entrada leva o resultado de volta para a Entrada e decodifica de novo.

Exemplos

Valor de parâmetro com acento, espaço e &

texto
preço: R$ 10,00 & frete grátis
Componente · encodeURIComponent
pre%C3%A7o%3A%20R%24%2010%2C00%20%26%20frete%20gr%C3%A1tis

URL inteira: a estrutura fica, o resto é codificado

URL
https://exemplo.com/busca?q=café com leite&ordem=preço
URL inteira · encodeURI
https://exemplo.com/busca?q=caf%C3%A9%20com%20leite&ordem=pre%C3%A7o

Erro comum: “%” sem os dois dígitos

decodificar
100%
mensagem
Linha 1, coluna 4 — “%” sem os dois dígitos hexadecimais: cada “%” precisa de dois (ex.: %20). Para um “%” literal, use %25.

Como o percent-encoding funciona

Uma URL só pode levar um conjunto pequeno de caracteres ASCII. O resto passa por percent-encoding (RFC 3986): o texto vira bytes em UTF-8 e cada byte é escrito como “%” seguido de dois dígitos hexadecimais. Letras, números e os não reservados - _ . ~ nunca precisam de código; o espaço vira %20.

Como a conta é feita em bytes, o tamanho depende do caractere: uma letra acentuada ocupa 2 bytes (“é” vira %C3%A9) e um emoji ocupa 4 (“👋” vira %F0%9F%91%8B), ou seja, 12 caracteres na URL para um só símbolo na tela.

O mesmo “é” pode ser escrito de dois jeitos em Unicode: um caractere só (NFC) ou “e” seguido de um acento combinante (NFD, comum em nomes de arquivo do macOS). Na tela parecem iguais, mas o NFC vira %C3%A9 e o NFD vira e%CC%81. O texto não é normalizado: a saída sai exatamente dos caracteres que você colou.

Os quatro modos com o mesmo texto

Com o texto don't (stop)!*~ é/ cada modo dá uma saída diferente. Componente (encodeURIComponent): don't%20(stop)!*~%20%C3%A9%2F. Estrito (RFC 3986): don%27t%20%28stop%29%21%2A~%20%C3%A9%2F. Formulário (URLSearchParams): don%27t+%28stop%29%21*%7E+%C3%A9%2F. URL inteira (encodeURI): don't%20(stop)!*~%20%C3%A9/.

O encodeURIComponent deixa passar ! ' ( ) * porque segue a RFC 2396, anterior à 3986, que os listava como “marcas” sem significado especial. A RFC 3986 os reservou como subdelimitadores, por isso o modo Estrito os codifica. O encodeURI deixa passar também ; / ? : @ & = + $ , #, que dão estrutura à URL inteira.

O Formulário segue o padrão application/x-www-form-urlencoded do WHATWG: espaço vira +, * passa sem código e ~ vira %7E. Fora do JavaScript, quote(s, safe="") do Python e rawurlencode do PHP dão o mesmo resultado que o modo Estrito.

Decodificar sem “URI malformed”

O decodeURIComponent lança URIError: URI malformed sem dizer onde está o problema. Aqui cada erro tem linha e coluna: “%” sem os dois dígitos (como em 100%), dígitos que não são hexadecimais (%ZZ) e sequências que não formam UTF-8 (%C3 sem o byte seguinte) apontam o trecho exato e dizem como corrigir.

O decodeURI, equivalente ao modo URL inteira, mantém codificados os reservados como %2F e %3F, porque decodificá-los mudaria a estrutura da URL (um %2F dentro de um parâmetro viraria uma barra de caminho). O status avisa quantas sequências ficaram assim.

Sites antigos codificavam em Latin-1 (Windows-1252), não em UTF-8: “ação” aparecia como a%E7%E3o, que não é UTF-8 válido. Ler como Latin-1 interpreta cada byte como um caractere e devolve “ação”.

%20 ou +, dupla codificação e privacidade

O + como espaço vale só no corpo de formulários e em query strings que seguem esse formato; no caminho da URL, + é um + mesmo. Na dúvida, %20 funciona nos dois lugares. Ao decodificar, só o modo Formulário lê + como espaço.

Dupla codificação acontece quando um texto já codificado passa de novo pelo codificador: o “%” vira %25, e %20 vira %2520. O sinal é um resultado que ainda tem sequências %XX depois de decodificar; Usar como entrada decodifica a segunda camada.

Percent-encoding não é criptografia: qualquer pessoa decodifica sem chave. Esta página roda inteira no seu navegador: o texto não é enviado para servidor nem salvo, nem no armazenamento local.

Perguntas frequentes

Qual a diferença entre encodeURI e encodeURIComponent? Qual uso no parâmetro?
O encodeURIComponent codifica tudo que tem significado na URL, inclusive / ? & = e #, e serve para o valor de um parâmetro: "?q=" + encodeURIComponent(busca). O encodeURI mantém esses caracteres e serve para uma URL inteira que já está montada. Usar o encodeURI num valor que contém & ou = quebra a query string.
Espaço vira %20 ou +?
Os dois existem. %20 é o percent-encoding da RFC 3986 e vale em qualquer parte da URL. O + vem do formato application/x-www-form-urlencoded, usado no envio de formulários e pelo URLSearchParams, e só é lido como espaço na query string. Use o modo Formulário quando o destino espera +; nos demais casos, %20.
O que é “URIError: URI malformed” e como achar o erro?
É o erro do decodeURIComponent e do decodeURI quando a entrada tem um “%” sem dois dígitos hexadecimais depois ou bytes que não formam UTF-8 (comum em links antigos em Latin-1). A mensagem nativa não diz onde. Cole a entrada aqui em Decodificar: o erro mostra linha, coluna e o trecho, e Ir para o erro seleciona o ponto exato.
O que é %2520 e como desfazer a dupla codificação?
%25 é o código do próprio “%”. Quando um texto com %20 é codificado de novo, o “%” vira %25 e o resultado fica %2520. Para desfazer, decodifique duas vezes: aqui a página avisa quando o resultado ainda tem sequências %XX, e Usar como entrada faz a segunda decodificação. Para evitar, codifique cada valor uma vez só, no momento de montar a URL.
Quais caracteres nunca são codificados? Por que ! ' ( ) * passam?
Letras A–Z e a–z, números e - _ . ~ são os não reservados da RFC 3986 e nunca precisam de código. O encodeURIComponent também deixa passar ! ' ( ) *, herança da RFC 2396, que os considerava seguros. Se o destino exige a RFC 3986 estrita (assinaturas OAuth 1.0, AWS SigV4), use o modo Estrito, que os codifica.
Como fazer URL encode em Python, PHP e JavaScript?
JavaScript: encodeURIComponent(s) e decodeURIComponent(s); para formulário, new URLSearchParams({ q: s }).toString(). Python: urllib.parse.quote(s, safe="") e o rawurlencode($s) do PHP dão o mesmo que o modo Estrito. O urlencode($s) do PHP dá o mesmo que o modo Formulário, exceto o *, que ele codifica como %2A; o quote_plus(s) do Python também codifica o * como %2A e, além disso, mantém o ~ sem código.

Ferramentas relacionadas

  • Cole texto ou Base64: o sentido é detectado sozinho, acentos e emoji saem certos e o erro mostra a posição exata.

  • Cole o JSON: ele é validado e formatado na hora, e o erro aparece com linha, coluna e o que corrigir.

Atualizado em .