Pular para o conteúdo

URL Encoder / Decoder · Encoding

Codificador / Decodificador de URL & parser de query string

Codifique um valor do jeito que a posição dele realmente exige, decodifique um que voltou estragado, ou cole uma URL inteira e leia cada parâmetro de query com o texto bruto ao lado. Dupla codificação, + contra %20, hosts em punycode e chaves repetidas são todos apontados pelo nome — no lado do cliente, sem enviar nada.

Roda no seu navegador — nada do que você cola sai desta página. Como comprovamos isso

Roda no seu navegador RFC 3986 por componente Sem cadastro Atualizado em 30 de jul. de 2026

Playground do codificador, decodificador e parser de query string de URL

Examples
Mode
Options

Paste a full URL, a bare query string starting with ?, or a form body like a=1&b=2. Nothing is uploaded — the whole thing runs in this tab, so query strings carrying tokens stay yours.

Results update as you type — press Enter to run now.

Result

Paste a URL to see its components and every query parameter decoded — or switch to Decode or Encode to work on one value at a time.

A lacuna

Um botão e um palpite escondido sobre onde o valor vai parar.

Quase toda caixa de «URL encode» da web é um único botão ligado a encodeURIComponent(), e nunca diz isso. Essa é a regra certa para um valor de query e a errada para uma URL que você já montou: dê um link a ela e cada : e / volta como %3A e %2F. Codifique duas vezes sem querer e você tem %2520, o bug que quebra as idas e voltas do redirect_uri do OAuth e deixa um callback de webhook em 404 às 3 da manhã.

Esta ferramenta torna a escolha explícita em vez de esconder. Regras de componente ou de URL inteira, + ou %20 e — no modo Parse — os componentes que um navegador vai realmente enviar ao lado do texto bruto que você colou, com cada parâmetro decodificado e etiquetado: duplicado, chave sem valor, valor vazio, codificado duas vezes.

É também o motivo para não perguntar a um chatbot. Um modelo de linguagem a quem se pede «codifique isto para URL» está prevendo caracteres: ele mistura + e %20 na mesma string, esquece que é tem dois bytes e «conserta» com toda a confiança um valor duplamente codificado codificando-o uma terceira vez. Esta página roda o algoritmo real, byte a byte, e fixa cada regra que aplica com um vetor de teste — para você conferir a resposta que recebeu contra a especificação, e não contra um parágrafo confiante.

Trabalhando em um token em vez de uma URL? O JWT Decoder divide e decodifica em base64url um JWT, e o Codificador / Decodificador Base64 dá conta do alfabeto base64url.

O pipeline

Como funciona.

Quatro passos determinísticos, todos dentro da sua aba: o texto bruto é diagnosticado antes de o parser de URL ter permissão para normalizar qualquer coisa.

  1. Primeiro, dividir o texto bruto.

    A entrada é cortada nos seus próprios ? e # antes de qualquer parser tocá-la, para que um diagnóstico possa apontar o caractere exato: o padrão de URL remove tabulações e quebras de linha em silêncio.

  2. Decodificar cada parte sozinha.

    Nomes e valores são decodificados separadamente, então um %26 dentro de um valor nunca vira separador e um %3D nunca divide um nome.

  3. Ler os bytes como UTF-8.

    Escapes viram bytes e bytes viram texto. Uma sequência malformada é nomeada byte por byte em vez de lançar o URIError que decodeURIComponent() lançaria.

  4. Normalizar como um navegador e mostrar os dois.

    O parser WHATWG fornece o que qualquer cliente HTTP realmente vai enviar — host em punycode, porta padrão descartada — com o seu texto bruto ao lado.

Referência

Caracteres reservados, por componente.

A RFC 3986 não tem uma lista única de caracteres «inseguros». Um caractere é reservado porque significa algo em uma posição específica — então se ele precisa ser escapado depende inteiramente de onde ele está.

Caractere Em um segmento de caminho Em nome / valor de query
/ gen-delim Precisa ser codificado (%2F), senão divide o segmento Seguro como dado, mas alguns proxies normalizam
? gen-delim Precisa ser codificado (%3F): ele abre a query Seguro depois do primeiro ?
# gen-delim Precisa ser codificado (%23) Precisa ser codificado (%23): ele abre o fragmento
[ ] gen-delim Precisa ser codificado (%5B %5D) Precisa ser codificado, mesmo em um nome no estilo tags[]
: @ gen-delim Seguro após o primeiro segmento Seguro
& sub-delim Seguro como dado Precisa ser codificado (%26): ele separa parâmetros
= sub-delim Seguro como dado Precisa ser codificado (%3D) no nome; seguro no valor
+ sub-delim Seguro como dado Precisa ser codificado (%2B): cru, ele é lido como espaço
; sub-delim Seguro como dado Seguro hoje, mas um backend legado pode dividir por ele
! $ ' ( ) * , sub-delim Seguro como dado Seguro como dado — mas encodeURIComponent() discorda em ! ' ( ) *
% marcador de escape Sempre %25 Sempre %25: é de um % cru que nasce a dupla codificação
space não permitido %20 %20, ou + em um corpo de formulário

O que cada modo deixa em paz

O conjunto seguro é toda a diferença entre os modos — e entre a RFC 3986 e a função nativa do navegador.

safe-sets
mode                       left alone (everything else → %XX)

RFC 3986 component         A-Z a-z 0-9 - . _ ~
RFC 3986 whole URL         …plus  : / ? # [ ] @ ! $ & ' ( ) * + , ; =
form-urlencoded            A-Z a-z 0-9 * - . _        (space → +)
encodeURIComponent()       A-Z a-z 0-9 - . _ ~ ! ' ( ) *
                                                 ^^^^^^^^^^
                                       RFC 2396 leftovers — encoded here

Codificado uma vez contra duas

Um valor duplamente codificado não está corrompido: está correto, só uma camada fundo demais.

double-encoding
once   https%3A%2F%2Fapp.example.com%2Fcb   →  https://app.example.com/cb
twice  https%253A%252F%252Fapp.example.com  →  https%3A%2F%2Fapp.example.com
                 ^^^                            still escaped: decode again

space  %20    →  " "
       %2520  →  "%20"  →  " "        (the % became %25)

Próximo passo

O parâmetro que você acabou de decodificar é um token. Leia ele.

Query strings carregam tokens de acesso, URLs assinadas e ids de sessão. Depois que um valor está decodificado, o JWT Decoder divide e verifica um token base64url, e o Base64 Encoder / Decoder cuida de tudo que está apenas codificado e não assinado — os dois, como esta página, inteiramente no seu navegador.

callback.txt
?state=abc%3D%3D          →  state    = abc==
&channel=%23alerts       →  channel  = #alerts
&next=%252Fsettings      →  next     = %2Fsettings   ← decode again
&utm_source=a&utm_source=b  →  two rows, no winner

FAQ

Suas perguntas, respondidas.

Toque em uma pergunta para expandir a resposta.

encodeURIComponent() escapa quase tudo, então é o que você usa em um único pedaço de URL — um valor de query, um segmento de caminho. encodeURI() deixa em paz os caracteres reservados : / ? # & = + e até o #, então é o que você usa em uma URL já montada que só precisa se livrar dos espaços e dos caracteres não ASCII. Passe uma URL inteira para encodeURIComponent e ela vira um bloco opaco (https%3A%2F%2F…); passe um único valor para encodeURI e qualquer & dentro dele silenciosamente se torna um separador de parâmetros. O modo Encode aqui expõe os dois: o padrão é a regra de componente, e a caixa «Whole URL» é encodeURI() byte a byte.

Os dois estão certos, em lugares diferentes. A RFC 3986 só conhece %20. A convenção do + vem do envio de formulários HTML (application/x-www-form-urlencoded) e vale para corpos de formulário e, por hábito antigo, para query strings — por isso URLSearchParams decodifica + como espaço, mas o deixa intacto dentro de um caminho. Ou seja: %20 é sempre seguro, enquanto + só é espaço se quem produziu o valor decidiu assim. O modo Decode mostra qual convenção foi aplicada e deixa você inverter, para distinguir «Ada+Lovelace» o nome de «Ada Lovelace» as duas palavras.

A codificação percentual substitui um byte por um % seguido daquele byte escrito em dois dígitos hexadecimais. Uma URL só pode carregar um conjunto pequeno de caracteres ASCII, então todo o resto — um espaço, um acento, um emoji ou um caractere reservado usado como dado — primeiro é convertido em bytes UTF-8 e depois cada byte é escrito como %XX. é tem dois bytes, então vira %C3%A9. Decodificar faz o inverso: juntar os bytes e lê-los de volta como UTF-8.

Decodifique duas vezes. %2520 significa que o % de %20 também foi codificado, virando %25 — o que acontece quando um cliente chama encodeURIComponent() em um valor que já estava codificado: o clássico bug do redirect_uri do OAuth. Esta ferramenta detecta isso: cole o valor no modo Decode e ela avisa que a primeira passada ainda contém escapes, mostra o que uma segunda passada produz e oferece o botão «Decode again». O conserto de verdade é mais acima: codificar exatamente uma vez, no momento em que o valor entra na URL.

Porque os bytes escapados não são UTF-8 válido. %C3%A9 é uma sequência de dois bytes bem formada e decodifica para é, mas %E9 sozinho é o byte Latin-1 (ISO-8859-1) de é e não é UTF-8 legal, então decodifica para U+FFFD, o caractere de substituição. Esta ferramenta nomeia os bytes problemáticos em vez de lançar o URIError que decodeURIComponent() lançaria, o que diz a você que o valor foi codificado a partir da codificação de origem errada, em vez de deixar você no escuro.

Nada no padrão de URL diz qual vence, então aqui cada linha é listada e as posteriores são marcadas como duplicadas. Na prática, PHP e Express ficam com o último valor, r.URL.Query() do Go devolve todos, o ASP.NET junta com vírgulas, e o Rails só agrupa quando a chave termina em []. Essa discordância é justamente o motivo pelo qual uma ferramenta deve mostrar todos os valores em vez de escolher um em silêncio.

Punycode é a codificação ASCII de um nome de domínio internacionalizado. O DNS só carrega rótulos ASCII, então münchen.example é convertido para xn--mnchen-3ya.example antes de qualquer resolução — e essa forma ASCII também é a que um certificado TLS precisa casar. O parser aqui mostra o host convertido com o nome que você digitou logo abaixo, para você identificar um domínio sósia. Ele deliberadamente não converte punycode de volta para Unicode: exibir como Unicode bonitinho um nome fornecido por um atacante é exatamente como funciona o phishing homográfico.

O conjunto não reservado da RFC 3986 §2.3: A–Z, a–z, 0–9 e as quatro marcas - . _ ~. Eles são seguros em qualquer posição e nunca devem ser codificados sem motivo, porque %2D e - são a mesma URL e recodificá-los quebra esquemas de assinatura que fazem hash da string bruta. Repare: encodeURIComponent() também deixa em paz ! ' ( ) *, uma herança do antigo conjunto «mark» da RFC 2396. A RFC 3986 lista esses cinco como subdelimitadores, então o modo de componente aqui os escapa e avisa quando discorda da função nativa do navegador.

Não mais. O HTML já sugeriu que servidores aceitassem ; ao lado de & como separador de parâmetros, e esse conselho foi retirado da especificação em 2014. Navegadores e URLSearchParams nunca trataram o ; como separador, então a=1;b=2 é um único parâmetro chamado a cujo valor é o literal 1;b=2. Esta ferramenta reproduz esse comportamento e avisa quando vê um ponto e vírgula, porque um backend legado pode ainda dividir por ele e discordar do navegador que está na frente dele.

Sim: a ferramenta inteira é uma página estática sem servidor por trás. Analisar, codificar e decodificar acontecem na sua aba, nada é enviado, não há log e não há conta. Isso pesa mais aqui do que na maioria das ferramentas, porque query strings são exatamente onde acabam tokens de acesso, URLs assinadas, ids de sessão e endereços de e-mail. Se quiser uma segunda opinião, abra o painel de rede das ferramentas de desenvolvedor enquanto digita: não há requisição alguma para ver.

More free, private DevOps tools.

O URL Encoder / Decoder é uma das ferramentas do OpsCanopy — uma copa crescente de validadores, conversores e testadores que rodam no navegador e nunca tocam um servidor.

39 ferramentas gratuitas, todas capazes de funcionar offline — o opscanopy.com não exige cadastro e não envia nada.

Ferramentas de codificação relacionadas: o Codificador / Decodificador Base64, o JWT Decoder e o Slugify, para transformar um título em um caminho limpo, ou explore o diretório completo de ferramentas.

Fornecido como está, por conveniência; codificação percentual é uma codificação, não uma proteção — um token em uma query string continua sendo um token em um arquivo de log. OpsCanopy é livre e gratuito.