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
Playground do codificador, decodificador e parser de query string de URL
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.
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.
-
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.
-
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.
-
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.
-
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.
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.
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.
?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.
Qual é a diferença entre encodeURI e encodeURIComponent?
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.
Por que um espaço às vezes vira + e às vezes %20?
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.
O que é codificação percentual, exatamente?
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.
Como conserto uma URL codificada duas vezes (%2520)?
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.
Por que meu texto decodificado mostra � em vez de um acento?
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.
O que acontece quando uma query string repete a mesma chave?
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.
O que é punycode e por que meu host mudou?
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.
Quais caracteres nunca precisam ser codificados em uma URL?
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.
Um ponto e vírgula pode separar parâmetros de query?
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.
É seguro colar uma URL que contém um token?
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.
Mais em Codificação
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.