Tutti gli articoli

Text Reverse: perché "invertire un testo" è più difficile di quanto sembri

"I topi non avevano nipoti" è un celebre palindromo italiano: ignorando spazi e maiuscole, si legge identico al contrario. Invertire un testo italiano lettera per lettera, accenti compresi, funziona quasi sempre senza problemi, perché ogni vocale accentata è un solo punto di codice Unicode. Le complicazioni vere arrivano da un'altra direzione.

Cosa succede a livello di byte

Le vocali accentate italiane occupano più di un byte in UTF-8. Un'implementazione ingenua che inverte una stringa a livello di byte grezzi anziché di punti di codice Unicode spezza un carattere multi-byte nei suoi singoli byte e li inverte separatamente. Il risultato è una sequenza di byte non valida, che in fase di rendering compare come o come un carattere "rotto" invece della lettera semplicemente spostata.

Cos'è un cluster di grafemi

Ciò che una persona percepisce come "un singolo carattere visibile" a volte in Unicode è composto da più punti di codice — un'emoji di famiglia (👨‍👩‍👧), ad esempio, è in realtà diverse emoji separate unite da un carattere di giunzione a larghezza zero. Una combinazione di questo tipo si chiama cluster di grafemi.

Perché un'inversione ingenua rovina tutto

Se una stringa viene invertita per singoli punti di codice invece che per cluster di grafemi, il carattere di giunzione finisce nel posto sbagliato, e al posto di un'unica emoji visibile si ottiene un insieme di caratteri separati e scollegati — spesso quadratini "rotti" o emoji casuali al posto dell'originale.

Un'inversione corretta

Un'implementazione corretta lavora sui punti di codice (non sui byte) e in più divide la stringa in cluster di grafemi, tenendo conto di giunzioni, modificatori e caratteri combinanti, prima di invertire l'ordine dei cluster stessi, non dei singoli punti di codice al loro interno.

A cosa serve

  • Verificare un palindromo come "I topi non avevano nipoti" o creare un effetto testo "a specchio".
  • Dimostrare o diagnosticare un bug nella gestione di Unicode nel codice.
  • Attività ricreative o didattiche che richiedono un'inversione corretta di testo con emoji.
Prova lo strumento