O que é Punycode?
Punycode é uma sintaxe de codificação definida na RFC 3492 que transforma strings Unicode no conjunto limitado de caracteres ASCII suportado por DNS. É a base técnica que torna Nomes de Domínio Internacionalizados (IDNs) possíveis, permitindo nomes de domínio em qualquer idioma funcionar com a infraestrutura de DNS existente.
O Problema que Punycode Resolve
O Sistema de Nome de Domínio foi projetado nos anos 80 com apenas caracteres ASCII em mente. Os labels de DNS podem conter apenas:
- Letras minúsculas (a-z)
- Dígitos (0-9)
- Hífens (-)
Esta limitação excluía bilhões de usuários da internet que não usam principalmente o alfabeto latino. Punycode preenche essa lacuna codificando qualquer string Unicode em ASCII válido.
Como Funciona a Codificação Punycode
Punycode usa um algoritmo inteligente que preserva caracteres ASCII enquanto codifica caracteres não-ASCII em uma representação ASCII compacta.
O Processo de Codificação
1. Separar Caracteres: Dividir em caracteres ASCII e não-ASCII
2. Copiar ASCII: Manter todos os caracteres ASCII em suas posições originais
3. Codificar Não-ASCII: Usar uma codificação de inteiro de comprimento variável generalizada
4. Adicionar Prefixo: Preparar "xn--" para indicar codificação Punycode
Exemplos
| Original (Unicode) | Codificado (Punycode) |
|---|---|
| münchen | xn--mnchen-3ya |
| 北京 | xn--fiqs8s |
| münchen.de | xn--mnchen-3ya.de |
| 中文.com | xn--fiq228c.com |
| café.com | xn--caf-dma.com |
O Prefixo "xn--"
O prefixo "xn--" é chamado de ACE (ASCII Compatible Encoding). Ele sinaliza aos resolvedores DNS e aplicações que o label contém conteúdo codificado em Punycode. Este prefixo:
- É sempre minúsculo
- Nunca aparece em nomes de domínio ASCII regulares
- Dispara decodificação Unicode em software compatível
Punycode na Prática
Manipulação do Navegador
Os navegadores modernos manipulam Punycode automaticamente:
Usuário digita: 中文.com
Navegador envia: xn--fiq228c.com (para DNS)
Navegador exibe: 中文.com (na barra de endereços)
Implementação para Desenvolvedores
JavaScript (Node.js):const punycode = require('punycode/');
// Codificar para Punycode
const encoded = punycode.toASCII('münchen.de');
// Resultado: xn--mnchen-3ya.de
// Decodificar de Punycode
const decoded = punycode.toUnicode('xn--mnchen-3ya.de');
// Resultado: münchen.de
Python:
domain = 'münchen.de'
encoded = domain.encode('idna').decode('ascii')
# Resultado: xn--mnchen-3ya.de
Manipulação de URL
Ao trabalhar com URLs contendo IDNs:
// A API URL manipula Punycode automaticamente
const url = new URL('https://中文.com/path');
console.log(url.hostname); // xn--fiq228c.com
console.log(url.href); // https://xn--fiq228c.com/path
Implicações de Segurança
A capacidade de Punycode representar qualquer caractere Unicode cria riscos de segurança:
Spoofing Visual
Os atacantes podem registrar domínios que parecem idênticos aos sites legítimos:
аррlе.com (Cirílico 'а' e 'р')
apple.com (Letras latinas)
Ambos exibem identicamente em algumas fontes, mas são domínios diferentes.
Proteções do Navegador
Para combater spoofing, navegadores implementam proteções:
1. Detecção de Script Misto: Exibir Punycode para IDNs suspeitos em vez da forma Unicode
2. Detecção Confundível: Sinalizar domínios usando caracteres que parecem ASCII
3. Whitelist: Permitir exibição Unicode apenas para TLDs bem conhecidas
Trabalhando com Punycode em APIs
Ao construir ferramentas de domínio:
Sempre Armazene Punycode: Use o formato ASCII internamente para consistência e indexação de banco de dados. Aceite Ambas as Formas: Deixe os usuários inserir Unicode ou Punycode, convertendo conforme necessário. Exiba Unicode: Mostre a forma legível para humanos em interfaces de usuário.function normalizeDomain(input) {
const punycode = require('punycode/');
// Converter para Punycode em minúsculas para uso interno
return punycode.toASCII(input.toLowerCase());
}
Punycode é transparente para a maioria dos usuários, mas conhecimento essencial para desenvolvedores construindo aplicações web internacionalizadas.