1

Como funciona o truque das "letras diferentes" no Instagram e WhatsApp (é tudo Unicode)

Você já viu alguém com a bio do Instagram em 𝓵𝓮𝓽𝓻𝓪𝓼 𝓬𝓾𝓻𝓼𝓲𝓿𝓪𝓼 e ficou curioso sobre como funciona tecnicamente?

Não é font, não é imagem. É Unicode puro.

O que está acontecendo
O padrão Unicode reserva blocos inteiros de caracteres que visualmente imitam estilos tipográficos diferentes. O bloco principal é o Mathematical Alphanumeric Symbols (U+1D400 a U+1D7FF), criado originalmente para notação matemática científica — mas que acabou sendo adotado pela internet para estilizar texto.

Por exemplo:

A normal = U+0041
𝐀 negrito = U+1D400
𝘈 itálico sans = U+1D608
𝔄 fraktur = U+1D504
São caracteres distintos, não o mesmo "A" com CSS aplicado. Por isso colam em qualquer campo de texto — o app receptor só enxerga uma string Unicode válida.

Por que funciona em jogos e redes sociais
Qualquer sistema que suporte UTF-8 (que em 2026 é praticamente tudo) renderiza esses caracteres normalmente. Instagram, WhatsApp, Free Fire, Discord — todos aceitam porque do ponto de vista deles é só texto.

A única exceção costuma ser o @username, que geralmente tem validação regex restrita a [a-zA-Z0-9_.].

Outros blocos úteis
Enclosed Alphanumerics (U+2460+): Ⓐ Ⓑ Ⓒ (letras em bolha)
Fullwidth Latin (U+FF01+): A B C (largura total, estilo japonês)
Combining Diacritical Marks (U+0300+): gera efeitos como t̶a̶c̶h̶a̶d̶o̶ e s̲u̲b̲l̲i̲n̲h̲a̲d̲o̲
Zero Width characters (U+200B, U+200C, U+FEFF): criam o famoso "nick invisível" no Free Fire
Implementação simples em JS
const BOLD = [...'𝐀𝐁𝐂𝐃𝐄𝐅𝐆𝐇𝐈𝐉𝐊𝐋𝐌𝐍𝐎𝐏𝐐𝐑𝐒𝐓𝐔𝐕𝐖𝐗𝐘𝐙'];
const BOLD_LOWER = [...'𝐚𝐛𝐜𝐝𝐞𝐟𝐠𝐡𝐢𝐣𝐤𝐥𝐦𝐧𝐨𝐩𝐪𝐫𝐬𝐭𝐮𝐯𝐰𝐱𝐲𝐳'];

function toBold(text) {
return [...text].map(c => {
const upper = c.charCodeAt(0) - 65;
const lower = c.charCodeAt(0) - 97;
if (upper >= 0 && upper < 26) return BOLD[upper];
if (lower >= 0 && lower < 26) return BOLD_LOWER[lower];
return c;
}).join('');
}

toBold('Hello World') // → '𝐇𝐞𝐥𝐥𝐨 𝐖𝐨𝐫𝐥𝐝'
O truque é mapear cada char para o equivalente no bloco Unicode correto. Caracteres sem equivalente passam direto — daí a limitação com letras acentuadas do português.

Letras acentuadas são o problema
ã, ç, é, ô não têm equivalentes nos blocos Mathematical Alphanumeric. A solução usual é substituir pelo acento ignorado (a no lugar de ã) ou usar combining marks separados, o que nem sempre renderiza corretamente em todos os apps.

Se quiser ver uma implementação completa com 27 estilos e fallback para acentos, o letrasdiferentesonline.com tem o engine em JS no source — vale dar uma olhada em como resolvem o mapeamento.

Alguém mais já implementou algo assim ou tem uma abordagem melhor para os acentos?

Carregando publicação patrocinada...