URL Encoding: Tornando URLs Seguras para a Web
Você já copiou uma URL e viu %20 onde deveria ter um espaço, ou %C3%A9 onde tinha um caractere acentuado. Isso é URL encoding (também chamado percent-encoding), e existe porque URLs só podem conter um conjunto específico de caracteres ASCII.
Por Que URLs Precisam de Encoding
URLs têm caracteres reservados com significados especiais:
| Caractere | Significado na URL |
|---|---|
/ | Separador de caminho |
? | Início da query string |
& | Separador de parâmetros query |
= | Separador chave-valor |
# | Identificador de fragmento |
: | Separador de esquema (http:) |
@ | Separador de info do usuário |
Se seus dados contêm esses caracteres, você deve codificá-los para evitar ambiguidade. Caso contrário o navegador não consegue saber se & é parte dos seus dados ou um separador de query.
Como o Encoding Funciona
Cada caractere inseguro é substituído por % seguido do seu valor hex de dois dígitos:
| Caractere | Codificado | Valor Hex |
|---|---|---|
| Espaço | %20 | 0x20 |
! | %21 | 0x21 |
# | %23 | 0x23 |
& | %26 | 0x26 |
+ | %2B | 0x2B |
/ | %2F | 0x2F |
é | %C3%A9 | UTF-8: 0xC3 0xA9 |
Caracteres não-ASCII (acentos, CJK, emoji) são primeiro convertidos para bytes UTF-8, depois cada byte é percent-encoded.
JavaScript: encodeURI vs encodeURIComponent
Essa é a API mais confusa do JavaScript:
// encodeURI — codifica uma URL COMPLETA
// NÃO codifica: : / ? # [ ] @ ! $ & ' ( ) * + , ; =
encodeURI('https://example.com/path with spaces?q=hello world')
// "https://example.com/path%20with%20spaces?q=hello%20world"
// encodeURIComponent — codifica um COMPONENTE (valor)
// CODIFICA: : / ? # @ ! $ & ' ( ) * + , ; =
encodeURIComponent('price=10¤cy=USD')
// "price%3D10%26currency%3DUSD"Regra de ouro:
- Use
encodeURIComponent()para valores de parâmetros query - Use
encodeURI()apenas para codificar uma URL completa que já tem a estrutura correta - Melhor ainda: use as APIs
URLeURLSearchParams— elas fazem o encoding automaticamente
O Jeito Moderno: URL e URLSearchParams
// Construa URLs de forma segura — sem encoding manual
const url = new URL('https://api.example.com/search');
url.searchParams.set('q', 'café & croissant');
url.searchParams.set('page', '1');
console.log(url.toString());
// "https://api.example.com/search?q=caf%C3%A9+%26+croissant&page=1"
// Parse URLs existentes
const parsed = new URL('https://example.com/path?name=Jo%C3%A3o');
console.log(parsed.searchParams.get('name'));
// "João" — decodificado automaticamenteErros Comuns de Encoding
Double encoding: Codificar uma string já codificada. %20 vira %2520. Acontece quando você chama encodeURIComponent em um valor que já foi codificado.
Não codificar: Passar input cru do usuário em URLs. Se o nome de alguém é "O'Brien & Sons", sua URL quebra.
Usar + para espaços: Em query strings, + significa espaço (do encoding de formulários HTML). Mas em segmentos de caminho, + é um sinal de mais literal. %20 sempre significa espaço em todo lugar.
# Python
from urllib.parse import quote, unquote, urlencode
quote('café & croissant') # 'caf%C3%A9%20%26%20croissant'
unquote('caf%C3%A9') # 'café'
# Construir query strings
urlencode({'q': 'hello world', 'lang': 'pt'})
# 'q=hello+world&lang=pt'// Go
import "net/url"
encoded := url.QueryEscape("café & croissant")
// "caf%C3%A9+%26+croissant"
decoded, _ := url.QueryUnescape(encoded)
// "café & croissant"Quando Codificar o Quê
| Parte da URL | Codificar Com | Exemplo |
|---|---|---|
| URL completa | encodeURI() / new URL() | https://example.com/my%20page |
| Valor de param query | encodeURIComponent() / URLSearchParams | ?q=caf%C3%A9 |
| Segmento de caminho | encodeURIComponent() | /users/Jo%C3%A3o |
| Dados de formulário | application/x-www-form-urlencoded | name=Jo%C3%A3o&city=S%C3%A3o+Paulo |
Codifique/decodifique agora: Codificador/Decodificador URL — cole qualquer texto ou URL, codifique ou decodifique instantaneamente.