Lidando com caracteres especiais em slugs de URL: guia para desenvolvedores
A maioria dos geradores de slug funciona bem com texto em inglês simples. Mas o mundo real tem caracteres acentuados, alfabetos não latinos, emojis e símbolos. Este guia explica como lidar com todos eles ao gerar slugs de URL.
O problema: as URLs têm um conjunto de caracteres limitado
As URLs só podem conter com segurança caracteres ASCII: letras (a-z), dígitos (0-9) e alguns símbolos como hífens e sublinhados. Todo o resto precisa ser convertido ou codificado por porcentagem (como %C3%A9 para é). URLs com codificação por porcentagem são feias, difíceis de ler e ruins para SEO. A solução é a transliteração.
Transliteração: a técnica central
A transliteração converte os caracteres de um alfabeto para o equivalente ASCII mais próximo. Alguns exemplos comuns:
| Entrada | Transliterado | Idioma |
|---|---|---|
| é, è, ê, ë | e | Francês, português |
| ü, ö, ä | ue, oe, ae | Alemão |
| ñ | n | Espanhol |
| ß | ss | Alemão |
| ç | c | Francês, português |
Nosso gerador de slugs faz a transliteração automaticamente quando a opção «Transliterar» está ativada.
Normalização Unicode
Antes da transliteração, você precisa normalizar o texto Unicode. O caractere é pode ser armazenado de duas formas em Unicode:
- Composto (NFC): um único ponto de código (U+00E9)
- Decomposto (NFD): a letra «e» seguida de uma marca de acento combinante (U+0065 + U+0301)
Os dois parecem idênticos na tela, mas são bytes diferentes. Normalizar para NFKD (decomposição de compatibilidade) separa a letra base da marca de acento, facilitando a remoção dos acentos:
// JavaScript
function removeAccents(text) {
return text
.normalize('NFKD')
.replace(/[\u0300-\u036f]/g, '');
}
removeAccents('Café Résumé');
// Output: Cafe Resume
Caracteres CJK (chinês, japonês, coreano)
Os caracteres CJK não se transliteram para o latim de forma significativa. Há duas abordagens comuns:
- Usar romanização (pinyin para o chinês, romaji para o japonês). Bibliotecas como
pinyin(npm) oukuroshirofazem isso, mas os resultados podem não corresponder às expectativas dos usuários. - Manter os caracteres como estão. Navegadores e mecanismos de busca modernos lidam bem com URLs Unicode. O Google consegue indexar URLs com caracteres CJK. A URL será codificada por porcentagem na barra de endereços, mas aparecerá corretamente nos resultados de busca.
Na maioria dos casos, a opção 2 é mais segura—texto CJK romanizado pode ser ilegível para falantes nativos.
Emojis nas URLs
Embora seja tecnicamente possível (emojis são codificados por porcentagem), colocar emojis em slugs é uma má ideia:
- Eles viram strings codificadas por porcentagem extremamente longas
- Eles quebram em muitos sistemas e APIs
- Os mecanismos de busca podem não indexá-los corretamente
- Não podem ser digitados manualmente
Sempre remova os emojis durante a geração do slug. Um padrão de regex simples pode removê-los:
text.replace(/[\u{1F600}-\u{1F6FF}\u{2600}-\u{26FF}\u{2700}-\u{27BF}]/gu, '')
Caracteres especiais comuns
Veja como um bom gerador de slugs lida com caracteres especiais comuns:
| Caractere | Ação | Motivo |
|---|---|---|
| & | Substituir por «and» ou remover | Tem significado especial nas URLs |
| @, #, ?, = | Remover | Caracteres reservados de URL |
| “ ” ‘ ’ | Remover | Pontuação, sem valor semântico no slug |
| — – | Substituir por hífen | Propósito similar, normalizar para o separador |
| / \ | Substituir por hífen | As barras criam segmentos de caminho |
Testando seu gerador de slugs
Teste com estas entradas complicadas para garantir que seu gerador lida com os casos extremos:
"Café Menu — Special Édition!"→cafe-menu-special-edition"100% Free & Open Source"→100-free-and-open-source" Lots of spaces "→lots-of-spaces"---triple---hyphens---"→triple-hyphens- String vazia → deve retornar vazio ou um valor padrão
Experimente estes exemplos diretamente na nossa ferramenta Slugify Online e veja como ela lida com cada caso.
Suporte de bibliotecas
Para uma comparação mais aprofundada das bibliotecas de slug entre linguagens, confira nosso guia sobre como converter texto em slug em JavaScript, Python e PHP. Cada biblioteca lida com os caracteres especiais de forma diferente, então escolha uma que se adeque ao seu caso de uso.