Ir para o conteúdo
🚀 10 ferramentas no ar, grátis para sempre — e continuamos crescendo
Início›Blog›Codificação de URL explicada: %20, + e erros comuns
Guias

Codificação de URL explicada: %20, + e erros comuns

Como um caractere vira %XX, que caracteres uma URL aceita como estão, por que encodeURIComponent e encodeURI dão resultados diferentes, quando um espaço é + e quando é %20, e como achar a dupla codificação por trás de um %2520.

✍ Pelo fundador e CEO, equipe BuildToolForge🗓 2026-10-31⏱ 8 min
codificação-urlcodificação-percentualquery-stringutf-8encodeuricomponent
Guia de codificação2026

Codificação de URL
sem complicação

Como o texto viaja com segurança dentro de uma URL

Caracteres reservados · %20 ou + · UTF-8

url · codificar
> encodeURIComponent("café & crème")
saídacaf%C3%A9%20%26%20cr%C3%A8me
> decodeURIComponent("a%2520b")
saídaa%20b
✓ ç tem dois bytes UTF-8, então vira dois %XX
Codificações comuns
%20
espaço
%2F
/
%3F
?
%26
&
%3D
=
%25
%
Não reservados: nunca codificadosReservados: codificados em valoresBytes UTF-8Não é criptografia

O que a codificação de URL realmente é

A codificação de URL, também chamada de codificação percentual, é como uma URL carrega caracteres que ela não pode conter. Uma URL só aceita um pequeno conjunto de letras ASCII, dígitos e sinais. Todo o resto — um espaço, um acento, um emoji, uma palavra em cirílico ou árabe — precisa ser escrito como % seguido de dois dígitos hexadecimais para cada byte.

O mesmo truque vale para caracteres que são permitidos mas têm significado. Um ? abre a consulta e um & separa parâmetros, então uma busca por pão & queijo precisa enviar o e-comercial como %26, ou o servidor vê dois parâmetros em vez de um.

Esse é todo o trabalho: deixar um valor seguro dentro de uma URL sem mudar o seu significado. Não é compressão, nem criptografia, nem filtro de segurança.

Como um caractere vira %XX

A codificação trabalha com bytes, não com caracteres. Primeiro o texto vira bytes UTF-8; depois cada byte que precisa ser codificado é escrito como % e seu valor em hexadecimal.

Um caractere ASCII é um byte, então um espaço (byte 32, hex 20) vira %20. Caracteres fora do ASCII ocupam de dois a quatro bytes em UTF-8, e cada byte ganha seu próprio escape:

  • ç → bytes C3 A7 → %C3%A7
  • € → bytes E2 82 AC → %E2%82%AC
  • 😀 → bytes F0 9F 98 80 → %F0%9F%98%80

Decodificar faz o caminho inverso: junta os bytes e os lê como UTF-8. Se os bytes foram gerados com outro conjunto de caracteres, como Latin-1, sai texto embaralhado — ação em vez de ação. Todos os navegadores e frameworks modernos usam UTF-8, e você também deveria.

Reservados, não reservados e por que o contexto importa

A RFC 3986 divide os caracteres de uma URL em dois grupos.

Os não reservados — A–Z a–z 0–9 - . _ ~ — nunca precisam ser codificados. Codificá-los é permitido mas inútil, e um bom codificador os deixa como estão.

Os reservados — : / ? # [ ] @ ! $ & ' ( ) * + , ; = — dão estrutura à URL. Codificar ou não depende de onde ele está. A / entre segmentos do caminho precisa continuar barra; uma / dentro de um nome de arquivo passado como parâmetro precisa virar %2F. Por isso não existe um único jeito certo de "codificar uma URL": você codifica cada parte conforme o destino.

encodeURIComponent vs encodeURI

O JavaScript tem duas funções nativas, e escolher a errada é o bug de URL mais comum.

FunçãoUse paraNão mexe em
encodeURIComponentUm valor: um parâmetro, um segmento de caminhoSó os não reservados
encodeURIUm endereço inteiro que precisa continuar funcionandoTambém os reservados

Aplique encodeURI a um valor como a&b=c e o & e o = sobrevivem, transformando um parâmetro em dois. Aplique encodeURIComponent a uma URL inteira e cada / e : é escapado, e o link deixa de ser link. A regra: monte a URL por partes e codifique cada valor com encodeURIComponent — ou, melhor ainda, deixe o URLSearchParams fazer isso.

Outras linguagens têm a mesma divisão: quote e quote_plus no Python, rawurlencode e urlencode no PHP. Nosso codificador e decodificador de URL oferece os dois modos para você ver a diferença no seu próprio texto.

+ ou %20: a exceção dos formulários

Num caminho, o espaço é %20 e um + é só um sinal de mais. Mas formulários HTML enviados com o tipo padrão application/x-www-form-urlencoded codificam o espaço como + na consulta, e os servidores decodificam de volta.

O problema começa quando as duas convenções se encontram. Um telefone como +55 11 91234-5678 colocado sem codificação numa consulta chega como 55 11 91234-5678, porque o servidor leu o + como espaço. A solução é codificar o mais como %2B, o que qualquer codificador que siga as regras de formulário faz. Na dúvida sobre a convenção do outro lado, %20 para espaço e %2B para mais são sempre seguros.

Dupla codificação e o bug %2520

%25 é o próprio sinal de porcentagem codificado. Então, quando você vê %2520 numa URL, é um %20 codificado pela segunda vez: um valor passou por um codificador depois de já estar codificado.

Isso costuma acontecer numa fronteira — um framework codifica um parâmetro que o código chamador já tinha codificado, ou uma URL de redirecionamento é codificada uma vez para caber em outra URL e depois de novo por uma biblioteca. O sintoma visível é um 404, uma busca pelo texto literal %20 ou um nome de arquivo cheio de sinais de porcentagem.

Decodificar duas vezes recupera o original, mas a correção de verdade é achar o segundo codificador e removê-lo. Codifique exatamente uma vez, no momento em que o valor entra na URL.

Codificar não é escapar, nem criptografar

A codificação percentual deixa um valor seguro dentro de uma URL. Ela não faz nada pelo HTML, JavaScript ou SQL. Assim que o servidor decodifica %3Cscript%3E, ele tem de novo um <script> comum, então a saída ainda precisa ser escapada conforme o destino e as consultas ao banco ainda precisam de parâmetros.

Também não é sigilo. Qualquer um decodifica uma URL, e URLs ficam em logs do servidor, histórico do navegador, ferramentas de análise e no cabeçalho Referer da página seguinte. Nunca coloque senha, token ou dados pessoais numa consulta porque "parece embaralhado". O mesmo vale para o Base64, como explica nosso guia de Base64.

Quando a decodificação dá errado

A maioria dos problemas com URL é um destes:

  • "URIError: malformed URI sequence". Um % não é seguido de dois dígitos hexadecimais, ou os bytes não são UTF-8 válido. Um sinal de porcentagem literal precisa ser enviado como %25.
  • Acentos saem como ç ou �. Os bytes foram escritos num conjunto de caracteres e lidos em outro. Garanta que os dois lados usem UTF-8.
  • Um parâmetro é cortado num &. O valor não foi codificado, ou foi codificado com encodeURI em vez de encodeURIComponent.
  • Sinais de mais viram espaços. A decodificação de formulário tratou o + como espaço. Codifique um mais de verdade como %2B.
  • %2520, %253D e companhia. Dupla codificação: ache o segundo codificador.

Cole a URL num decodificador e olhe cada parâmetro separadamente — o detalhamento costuma deixar o problema óbvio em segundos.

Ferramentas e guias relacionados:

Perguntas frequentes

O que é codificação de URL?⌄

A codificação de URL, ou codificação percentual, escreve os caracteres não permitidos numa URL como um % seguido de dois dígitos hexadecimais para cada byte UTF-8. Um espaço vira %20 e ç vira %C3%A7. Assim qualquer texto pode viajar dentro de uma URL sem mudar o significado.

Por que o espaço às vezes é + e às vezes %20?⌄

Formulários HTML enviados como application/x-www-form-urlencoded codificam o espaço como + na consulta. Em todos os outros lugares, incluindo caminhos e a maioria das APIs, o espaço é %20 e + é um sinal de mais literal. %20 é sempre seguro.

Devo usar encodeURI ou encodeURIComponent?⌄

Use encodeURIComponent para um único valor, como um parâmetro ou um segmento de caminho, porque ele codifica &, =, / e ?. Use encodeURI apenas para uma URL completa que precise manter a estrutura.

O que significa %2520?⌄

É um espaço codificado duas vezes: %25 é o sinal de porcentagem, então %2520 é %20 codificado pela segunda vez. Decodifique duas vezes para ler e corrija o código que codifica o valor duas vezes.

Codificação de URL é segura?⌄

Não. Qualquer um pode revertê-la, ela não traz sigilo e uma entrada decodificada ainda pode levar um ataque de injeção. Escape a saída para HTML, use consultas parametrizadas no banco e nunca coloque segredos numa URL.

Sobre o autor
Fundador e CEO, BuildToolForge
Siga-nos no X: @Buildtoolforge

Mais de 15 anos de experiência prática em desenvolvimento web e segurança. Foco em segurança web prática: manter sites seguros, confiáveis e fáceis de diagnosticar. O BuildToolForge existe para tornar essas verificações gratuitas, privadas e compreensíveis. As ferramentas rodam no seu navegador sempre que possível, e nada do que você digita em uma ferramenta é armazenado.

Como escrevemos nossos guias: Cada guia nasce da experiência prática, é conferido com os padrões oficiais e testado com nossas próprias ferramentas em domínios reais. Atualizamos os guias quando padrões ou ferramentas mudam. Encontrou um erro? Escreva para contact@buildtoolforge.com.

Última atualização: 2 de novembro de 2026