Como codificar uma string para URL
- Digite ou cole o texto em Texto ou URL. A saída é atualizada enquanto você digita.
- Escolha o modo em Codificar:
- Componente (encodeURIComponent) para um único valor de query, campo de formulário ou segmento de caminho.
- URL completa (encodeURI) para uma URL inteira que tem espaços ou caracteres não ASCII.
- Dados de formulário (espaço como +) para corpos
application/x-www-form-urlencodede query strings montadas do jeito que os formulários HTML fazem. - Todos os caracteres para aplicar percent-encoding a todos os bytes, letras incluídas, para testar decodificadores.
- Deixe o Charset em UTF-8, a menos que o sistema que vai receber espere uma codificação legada.
- Marque Cada linha separadamente para codificar uma lista de valores de uma vez e depois clique em Copiar saída. Inverter envia o resultado para o decodificador, para conferir a ida e volta.
Uma URL completa na entrada também é dividida em esquema, host, caminho, cada parâmetro de query e o fragmento, numa tabela abaixo dos painéis.
encodeURIComponent vs encodeURI vs form encoding
A mesma entrada, a b&c=d/é?#+, nos três estilos comuns:
| Modo | Saída | Use para |
|---|---|---|
Componente (encodeURIComponent) | a%20b%26c%3Dd%2F%C3%A9%3F%23%2B | um único valor dentro de uma URL |
URL completa (encodeURI) | a%20b&c=d/%C3%A9?#+ | uma URL inteira que já está estruturada corretamente |
Dados de formulário (URLSearchParams) | a+b%26c%3Dd%2F%C3%A9%3F%23%2B | envio de formulários HTML, muitas bibliotecas de query string |
Componente deixa sem escape só A–Z a–z 0–9 - _ . ! ~ * ' ( ). URL completa também mantém ; / ? : @ & = + $ , #, os caracteres que dão estrutura a uma URL, então não consegue proteger um valor que os contenha. Dados de formulário mantém só letras, dígitos e - _ . *, e escreve espaços como +.
O bug clássico é montar uma URL com a codificação URL completa: ?q=C++ & Go mantém o + e o &, e o servidor recebe q=C mais um parâmetro perdido. Codifique o valor com Componente: ?q=C%2B%2B%20%26%20Go.
Espaços, sinais de mais e outros encrenqueiros
| Caractere | Codificado | Por que importa |
|---|---|---|
| espaço | %20 ou + | + só significa espaço em query strings e corpos de formulário |
+ | %2B | sem codificar, muitos servidores o transformam em espaço: +49 30 1234567 vira 49 30 1234567 |
& | %26 | inicia um novo parâmetro de query |
= | %3D | separa nome e valor; o Base64 padrão termina com ele |
/ | %2F | divide segmentos de caminho; alguns servidores rejeitam %2F em caminhos |
# | %23 | inicia o fragmento, que nunca é enviado ao servidor |
% | %25 | precisa ser codificado também, senão o decodificador lê um escape quebrado |
€ | %E2%82%AC | três bytes UTF-8, três escapes |
Base64 em uma URL é um caso comum do problema de +, / e =. Aplique percent-encoding como componente ou mude para Base64URL, que evita esses caracteres.
Charsets que não são UTF-8
O percent-encoding trabalha com bytes, então o charset decide o resultado. é é %C3%A9 em UTF-8 e %E9 em Windows-1252 ou ISO-8859-1. Navegadores e APIs modernos usam UTF-8, mas aplicações PHP antigas, alguns gateways de pagamento e sistemas de intranet legados ainda esperam Latin-1 ou Windows-1252, e sites japoneses às vezes Shift_JIS. Escolha o charset correspondente em Charset. Um caractere que não existe no charset escolhido não pode ser representado, então confira a saída.
Codificar URL no código
encodeURIComponent("a b&c") // "a%20b%26c"
new URLSearchParams({ q: "C++ & Go" }).toString() // "q=C%2B%2B+%26+Go"
from urllib.parse import quote, quote_plus, urlencode
quote("/files/a b.txt") # '/files/a%20b.txt' (keeps / by default)
quote("/files/a b.txt", safe="") # '%2Ffiles%2Fa%20b.txt'
quote_plus("a b&c") # 'a+b%26c'
urlencode({"q": "C++ & Go"}) # 'q=C%2B%2B+%26+Go'
O quote do Python mantém / a menos que você passe safe="", uma surpresa frequente ao codificar um valor. Em outras linguagens: no PHP, rawurlencode gera %20 e urlencode gera +; o URLEncoder.encode do Java é form encoding com +; o Go tem url.PathEscape (%20) e url.QueryEscape (+). O encodeURIComponent não mexe em ! ' ( ) *; para uma saída estrita segundo a RFC 3986, substitua-os depois:
const strict = s => encodeURIComponent(s).replace(/[!'()*]/g,
c => "%" + c.charCodeAt(0).toString(16).toUpperCase());
Mais sobre o lado do JavaScript na página de Base64 em JavaScript. Para desfazer qualquer uma dessas codificações, use o decodificador de URL.
Perguntas frequentes
O que é codificação de URL?
A codificação de URL, ou percent-encoding, substitui os caracteres que não são permitidos ou que têm significado especial em uma URL por % e dois dígitos hex de cada byte. Um espaço vira %20, & vira %26 e é em UTF-8 vira %C3%A9.
Como codificar um espaço em uma URL: %20 ou +?
%20 funciona em qualquer lugar. + só significa espaço em query strings e corpos de formulário que seguem a convenção de form encoding; em um caminho, é um sinal de mais literal. Na dúvida, use %20.
Devo codificar a URL inteira?
Não, codifique cada valor antes de inseri-lo. Codificar uma URL inteira com Componente também escapa :, /, ? e &, o que a quebra. O modo URL completa mantém esses caracteres estruturais e só corrige espaços e texto não ASCII.
Por que minha string codificada tem %25?
%25 é um sinal de porcentagem codificado, o que significa que a entrada já estava codificada e foi codificada uma segunda vez: a%20b vira a%2520b. Codifique o texto bruto exatamente uma vez.
Hex em maiúsculas ou minúsculas no percent-encoding?
A RFC 3986 trata %2F e %2f como iguais e recomenda maiúsculas. Marque Hex em minúsculas só para bater com um sistema que gera minúsculas, por exemplo ao comparar assinaturas.