"Socorram-me, subi no ônibus em Marrocos" é um dos palíndromos mais conhecidos da língua portuguesa: ignorando espaços e acentuação, a frase se lê igual de trás para frente. Para texto em português sem acentos, inverter caractere por caractere funciona sem problemas — mas com acentos a coisa muda de figura, dependendo de como o texto foi codificado.
O que é um cluster de grafemas
O que uma pessoa percebe como "um caractere visível" às vezes é composto por vários pontos de código no Unicode — um emoji de família (👨👩👧), por exemplo, na verdade são vários emojis separados unidos por um caractere especial de junção de largura zero. Essa combinação é chamada de cluster de grafemas.
Por que uma inversão ingênua quebra tudo
Se uma string é invertida por pontos de código individuais em vez de clusters de grafemas, a junção acaba no lugar errado, e em vez de um único emoji visível surge um conjunto de caracteres separados e sem relação — muitas vezes aparecendo como quadrados "quebrados" ou emojis aleatórios no lugar do original.
Uma inversão correta
Uma implementação adequada primeiro divide a string em clusters de grafemas (levando em conta junções, modificadores e caracteres combinantes), e só então inverte a ordem desses clusters, não dos pontos de código individuais dentro deles.
Para que serve
- Verificar um palíndromo ou criar um efeito de texto "espelhado".
- Demonstrar ou diagnosticar um bug de manuseio de Unicode no código.
- Tarefas recreativas ou educacionais que precisam de uma inversão correta de texto com emojis.
Marcas diacríticas combinantes
O caractere "é", quando escrito como a letra base "e" mais um acento agudo combinante separado (em vez de um único caractere pré-composto), são dois pontos de código ligados por ordem: o acento sempre vem logo após o caractere ao qual se refere. Uma inversão ingênua por pontos de código troca a ordem entre eles, e o acento se "descola" da sua letra e se prende à vizinha — uma inversão correta precisa manter o caractere base e suas marcas combinantes juntos como uma única unidade.