Vai al contenuto
OneKitly

I falsi caratteri tipografici della tua bio non sono font: che cosa sono davvero quei caratteri

Pubblicato il 26/09/2025 · 13 min di lettura · Strumenti testo e lingua

Daniel Okonkwo

Daniel OkonkwoSviluppatore front-end e redattore Tech presso OneKitly

Performance web · Formati di file

Verificato su 5 fonti

Vedi il profilo
In breve

I generatori che promettono cento font per il tuo profilo non cambiano alcun font. Sostituiscono ogni lettera con un carattere diverso che per caso è disegnato in un altro stile. Fai passare «OneKitly» in un generatore in grassetto e ottieni i punti di codice U+1D400 U+1D425 U+1D425 U+1D422 U+1D427: nessuno di essi è la lettera A, l, l, i o n. Sono MATHEMATICAL BOLD CAPITAL A e i suoi vicini, caratteri che lo Standard Unicode ha aggiunto perché un articolo di fisica distingua un vettore in grassetto da uno scalare in corsivo. Essendo caratteri diversi, tutto ciò che confronta testo smette di funzionare: "OneKitly".includes(grassetto) restituisce false, toLowerCase() non li tocca, /\w/ e /[a-zA-Z]/ non li riconoscono e Number("𝟏𝟐𝟑") è NaN. Una frase di 33 caratteri passa da 33 a 117 byte UTF-8. Le tecnologie assistive leggono il buffer che ricevono, e questi caratteri non portano alcuna pronuncia: una bio scritta così viene annunciata male o saltata. Il blocco ha inoltre 28 buchi dove certe lettere erano già codificate altrove, ed è per questo che ogni generatore porta una tabella di rattoppi. La normalizzazione NFKC riporta tutto ad ASCII, quindi una piattaforma che normalizza cancella l'effetto in silenzio.

Una 𝐀 che sembra in grassetto non è la lettera A in grassetto: è U+1D400, un carattere distinto inventato per la matematica. Abbiamo stampato i punti di codice, misurato il costo in byte, rotto ricerca, ordinamento e conteggio parole, e scandito il blocco per trovarne i 28 buchi.

Che cosa fa davvero il generatore

Un font è un file. Contiene contorni e associa la lettera A a una forma. Scegliere un font in grassetto non cambia la lettera A; cambia il modo in cui la lettera A viene disegnata. Ognuno degli stili che un generatore di bio propone funziona al contrario: la lettera viene sostituita, e il disegno è quello che il font della piattaforma aveva già per il sostituto.

Stampa i punti di codice e la sostituzione salta all'occhio. La parola OneKitly nello stile grassetto è U+1D400 U+1D425 U+1D425 U+1D422 U+1D427; a doppio tratto U+1D538 U+1D55D U+1D55D U+1D55A U+1D55F; a spaziatura fissa U+1D670 U+1D695 U+1D695 U+1D692 U+1D697. Cinque lettere visibili, cinque punti di codice, nessuno nell'intervallo ASCII. In JavaScript la stringa dichiara .length 10, perché ciascuno di questi caratteri occupa due unità UTF-16.

Costano anche di più da memorizzare. La frase «Building tools for six languages.» ha 33 caratteri e 33 byte UTF-8 perché è puro ASCII. La stessa frase in grassetto ha ancora 33 caratteri, ma 61 unità UTF-16 e 117 byte UTF-8: tre volte e mezzo il carico per le stesse parole. Su una piattaforma che misura una bio in byte invece che in caratteri, è quasi tutto il budget speso per nulla.

Tutto ciò che confronta testo smette di corrispondere

La ricerca di sottostringa fallisce per prima. "OneKitly".includes(grassetto) restituisce false, e anche l'inverso, perché non condividono un solo punto di codice. Una ricerca interna, il trova-nella-pagina del browser, una clausola LIKE del database e un indice di hashtag si riducono allo stesso confronto, e falliscono tutti. Se il tuo nome visualizzato è in grassetto matematico, chi digita il tuo nome vero nella ricerca non ti troverà.

La conversione di maiuscole e minuscole non fa nulla. grassetto.toLowerCase() restituisce la stessa identica stringa, perché le corrispondenze di caso di Unicode per gli alfanumerici matematici mappano ogni carattere su sé stesso. Quindi una ricerca insensibile al caso che porta entrambi i lati in minuscolo fallisce lo stesso. L'unica cosa che funziona è la collazione: Intl.Collator("en", { sensitivity: "base" }).compare("𝐀", "A") restituisce 0, perché le tabelle di collazione di ICU ripiegano le lettere stilizzate sulle loro lettere di base. Vale la pena saperlo, perché spiega perché la stessa stringa è trovabile in un prodotto e invisibile in un altro: dipende solo dal fatto che il percorso di ricerca sia passato da un collatore o da un'uguaglianza di stringhe.

Le classi di caratteri si contraddicono. /[a-zA-Z]/.test("𝐀") è falso, /\w/u.test("𝐀") è falso, ma /\p{L}/u.test("𝐀") è vero: il carattere è davvero una lettera secondo la categoria generale di Unicode (Lu per la maiuscola, Ll per la minuscola), semplicemente non è una lettera ASCII. Le cifre si comportano allo stesso modo: /\d/u.test("𝟏") è falso mentre /\p{Nd}/u.test("𝟏") è vero, e Number("𝟏𝟐𝟑") è NaN benché la stessa stringa dopo NFKC venga letta come 123. Due validatori scritti da due squadre daranno quindi verdetti opposti sulla stessa bio.

L'ordinamento divide la differenza. Un semplice Array.prototype.sort() confronta unità UTF-16, quindi ["𝐁rown", "Adams", "Clark"] esce come Adams, Clark, 𝐁rown: il nome stilizzato è esiliato in fondo perché U+1D400 è numericamente maggiore di qualsiasi lettera ASCII. Passa a localeCompare e gli stessi tre danno Adams, 𝐁rown, Clark, che è ciò che un lettore si aspetta. Nessuno dei due sbaglia; rispondono a domande diverse, e un elenco che usa quello veloce non ti archivia da nessuna parte.

Il costo di accessibilità, detto senza giri di parole

Uno screen reader non vede la tua bio. Riceve la sequenza di caratteri che la piattaforma ha salvato e la passa a un sintetizzatore vocale, che cerca ogni carattere in un dizionario di pronuncia. Quel dizionario è fatto per le lettere con cui si scrive. U+1D400 non è una di quelle. Il sintetizzatore ha tre possibilità: leggere ad alta voce il nome Unicode del carattere, leggere un segnaposto generico, oppure saltarlo. Tutte e tre capitano nella pratica, e quale tocchi dipende dal lettore, dalla voce e dal livello di verbosità, non da qualcosa che l'autore controlli.

Il costo è facile da sottovalutare perché il guasto è invisibile a chi lo ha provocato. Tu vedi un nome elegante. Un lettore cieco può sentire trenta nomi di carattere di fila, oppure vedere sparire del tutto il nome del tuo account, lasciando una scheda con un'immagine e nessun titolo. Non c'è impostazione che quel lettore possa cambiare per rimediare, perché per la macchina il testo dice davvero un'altra cosa. È tutto l'argomento; non serve alcuna morale sopra.

Una famiglia è peggio delle altre. Gli insiemi cerchiati e cerchiati in negativo — Ⓐ U+24B6, 🅐 U+1F150 — non sono affatto lettere: la loro categoria generale è So, simbolo/altro. Un software che filtra un campo lasciando solo lettere e spazi li scarta, e uno che conta le lettere conterà zero.

I 28 buchi del blocco, e perché ogni generatore ha una tabella di rattoppi

Il blocco Mathematical Alphanumeric Symbols va da U+1D400 a U+1D7FF, cioè 1024 punti di codice. Scandendolo alla ricerca di caratteri assegnati se ne trovano 996, quindi 28 caselle sono vuote: restano 652 lettere latine (tredici stili da 52, meno quelle mancanti), 294 caratteri greci e affini, e 50 cifre in cinque stili.

Quattro dei 28 sono semplice riempimento riservato: U+1D6A6 e U+1D6A7 stanno fra la j corsiva senza punto e l'alfa maiuscola in grassetto, e U+1D7CC e U+1D7CD fra il digamma minuscolo in grassetto e la cifra zero in grassetto. Gli altri 24 sono caselle di lettere lasciate vuote di proposito perché quel carattere esatto era già stato codificato anni prima nel blocco Letterlike Symbols, a U+2100–U+214F.

L'elenco è abbastanza corto da darlo per intero. Manca la h corsiva perché esisteva già come U+210E PLANCK CONSTANT. Allo script mancano B, E, F, H, I, L, M, R (stanno a U+212C, U+2130, U+2131, U+210B, U+2110, U+2112, U+2133, U+211B) e le minuscole e, g, o (U+212F, U+210A, U+2134). Al fraktur mancano C, H, I, R, Z (U+212D, U+210C, U+2111, U+211C, U+2128). Al doppio tratto mancano C, H, N, P, Q, R, Z (U+2102, U+210D, U+2115, U+2119, U+211A, U+211D, U+2124): le lettere della teoria degli insiemi che ogni matematico aveva già.

Ecco perché il blocco si tradisce. Un generatore che mappa le lettere con semplice aritmetica — prendere il punto di codice di A e sommare lo scostamento dello stile — produce punti di codice non assegnati per quelle 24 lettere, e un punto di codice non assegnato compare come un quadratino vuoto. Un generatore fatto bene porta con sé la tabella di rattoppi. Uno frettoloso no, ed è per questo che il testo in script ha così spesso un buco proprio dove dovrebbe esserci una E o una R.

Dove questi caratteri sono la risposta giusta

Nulla di tutto ciò rende quei caratteri un errore. Esistono perché in matematica lo stile è il significato. Una R in grassetto e una R in corsivo non sono lo stesso simbolo letto in due modi: sono due simboli. ℝ sono i reali, R può essere un anello, e un vettore in grassetto non è lo scalare scritto con la stessa lettera. Codificare gli stili come caratteri distinti è ciò che permette a una formula di sopravvivere a una copia da un articolo a un'email senza perdere il contenuto.

È anche il criterio per capire se li stai usando bene. Se lo stile porta un'informazione che andrebbe persa senza di esso, il carattere è lo strumento giusto. Se lo stile è ornamento su prosa comune, allora lettere normali più una formattazione vera — il grassetto che produce il tuo editor, che lascia la lettera A essere la lettera A — è lo strumento giusto, ed è l'unico che screen reader, indice di ricerca e routine di ordinamento sappiano gestire tutti.

NFKC, e le piattaforme che cancellano l'effetto senza dirtelo

Unicode definisce una decomposizione di compatibilità per ciascuno di questi caratteri: lo standard stesso registra che U+1D400 è una variante di formattazione di A. La forma di normalizzazione NFKC applica quelle decomposizioni e poi ricompone, così grassetto.normalize("NFKC") sulla nostra frase di prova restituisce l'originale ASCII, carattere per carattere: abbiamo confrontato le due stringhe e sono uguali. Lo stesso capita al testo a larghezza piena (U+FF21 diventa A), alle lettere cerchiate (U+24B6 diventa A) e alle lettere modificatrici in apice (U+1D2C diventa A).

Molti servizi normalizzano in ingresso, di solito per impedire che due account abbiano nomi dall'aspetto identico. Quando lo fanno, lo stile che hai incollato è già sparito al momento del salvataggio, e nulla te lo dice: invii una bio stilizzata e ne riottieni una normale. Nulla è rotto; la piattaforma ha semplicemente chiesto al database dei caratteri che cosa dicesse davvero il tuo testo, e ha salvato quella risposta.

Due famiglie sopravvivono a NFKC, e sapere quali è utile. I maiuscoletti — ᴀ è U+1D00 LATIN LETTER SMALL CAPITAL A — sono lettere fonetiche delle estensioni IPA, prive di qualsiasi decomposizione di compatibilità, e attraversano la normalizzazione intatte. Lo stesso vale per le lettere cerchiate in negativo, 🅐 U+1F150 e affini. Agli occhi dello standard non sono varianti stilistiche di A: sono caratteri a sé. Questo le rende più durevoli e non più leggibili, ed è lo scambio su cui si regge tutta la categoria.

Una regola pratica per un profilo

Tieni in lettere normali i campi su cui si cerca: il tuo nome, il tuo identificativo, le parole che qualcuno digiterebbe per trovarti. È lì che la sostituzione ti costa qualcosa di misurabile. Se vuoi un fronzolo, mettilo dove nessuno interroga — un separatore, un singolo carattere decorativo — e lascia in chiaro le parole intorno.

E tieni una copia della versione semplice. Poiché la trasformazione è una tabella di corrispondenza, lo è anche il ritorno: normalizza con NFKC e recuperi esattamente l'originale per le famiglie matematica, a larghezza piena, cerchiata e in apice. Per i maiuscoletti e le cerchiate in negativo ti serve una mappa inversa, perché la normalizzazione non lo farà al posto tuo.

Una sola lettera A visibile, sei modi di codificarla — misurato con Node 26 e unicodedata 15.1 di Python
CaratterePunto di codiceNome UnicodeCategoriaDopo NFKC
AU+0041LATIN CAPITAL LETTER ALu (lettera)A (invariato)
𝐀U+1D400MATHEMATICAL BOLD CAPITAL ALu (lettera)A
𝔸U+1D538MATHEMATICAL DOUBLE-STRUCK CAPITAL ALu (lettera)A
U+FF21FULLWIDTH LATIN CAPITAL LETTER ALu (lettera)A
U+24B6CIRCLED LATIN CAPITAL LETTER ASo (simbolo, non una lettera)A
U+1D00LATIN LETTER SMALL CAPITAL ALl (lettera)ᴀ (sopravvive)
Generatore di font elegantiTrasforma il testo in Unicode grassetto, corsivo o monospazio per le bio (𝗚𝗿𝗮𝘀𝘀𝗲𝘁𝘁𝗼).Prova lo strumento

Domande frequenti

Una bio con falsi font danneggia la mia portata?
Ti toglie dalla ricerca testuale su quelle parole, il che è misurabile e indipendente da qualsiasi algoritmo di posizionamento. "OneKitly".includes(grassetto) è falso, quindi una query con il tuo nome normale non può corrispondere a uno stilizzato per sottostringa. Se una piattaforma specifica compensi dipende dal fatto che normalizzi o collazioni prima di indicizzare, e le piattaforme non lo pubblicano. La lettura prudente: ogni parola con cui vuoi essere trovato va scritta in lettere normali.
Perché alcune lettere appaiono come quadratini vuoti?
Due ragioni diverse dall'aspetto identico. O il generatore ha emesso uno dei 28 punti di codice non assegnati del blocco — spesso una lettera script, fraktur o a doppio tratto fra i 24 buchi — oppure il carattere esiste ma il font sul dispositivo del lettore non ha un glifo per esso. Il primo caso è un difetto del generatore e si vede da tutti; il secondo dipende dal dispositivo, ed è per questo che lo stesso messaggio è perfetto sul tuo telefono e rotto su quello di un altro.
Come riconverto il testo stilizzato in lettere normali?
Per le famiglie matematica, a larghezza piena, cerchiata e in apice basta una chiamata: testo.normalize("NFKC"). Abbiamo verificato che restituisce una frase intera esattamente: la frase in grassetto normalizzata risulta uguale all'originale ASCII. I maiuscoletti e le cerchiate in negativo non hanno decomposizione di compatibilità e sopravvivono alla normalizzazione, quindi richiedono una tabella inversa esplicita. Uno strumento di conversione porta entrambe le vie; un normalize di una riga copre la maggioranza.
Esiste uno stile che si possa usare senza rischi?
Non nel senso di essere invisibile al software: tutti cambiano i punti di codice, ed è tutto il meccanismo. Ciò che varia è quanto si perde. Sostituire un carattere decorativo fra due parole normali non costa quasi nulla. Sostituire un intero nome visualizzato costa la ricerca, l'ordinamento e la capacità delle tecnologie assistive di leggerlo. L'entità del danno segue il numero di lettere sostituite: usali per carattere, non per frase.
Perché il mio testo stilizzato a volte torna normale dopo il salvataggio?
Il servizio l'ha normalizzato. NFKC è il modo standard di decidere se due stringhe sono «lo stesso testo», e le piattaforme lo applicano a nomi visualizzati e identificativi per impedire l'impersonificazione per somiglianza. Una volta applicato, U+1D400 diventa A e non resta nulla da annullare. Nulla è rotto e non compare alcun errore, perché dal punto di vista della piattaforma è stato salvato esattamente ciò che hai digitato — secondo la definizione di «ciò che hai digitato» che fornisce il database dei caratteri.
Questi caratteri contano contro un limite di caratteri?
Dipende interamente da che cosa conta il limite, che è il solito problema dei limiti di caratteri. In punti di codice, la nostra frase di prova è 33 in entrambi i casi. In unità UTF-16 — ciò che .length restituisce in JavaScript e ciò che molti validatori di modulo usano — la frase normale è 33 e quella in grassetto 61. In byte UTF-8 è 33 contro 117. Un modulo che ti lascia scrivere 33 caratteri normali può accettarne solo 16 stilizzati, e il contatore accanto al campo non spiegherà perché.

Articoli che potrebbero interessarti

Tutte le guide
GuidaLe liste di attività in Markdown e cosa viene reso davvero e doveLe liste di attività non sono in CommonMark. Sono un'estensione di GitHub Flavored Markdown, ed è per questo che lo stesso file mostra caselle in un posto e parentesi quadre letterali in un altro. La regola esatta del marcatore, cosa fa l'annidamento e una tabella di cosa è CommonMark, cosa è GFM e cosa non è nessuno dei due — verificato su entrambe le specifiche e quattro motori di resa.SpiegazioneContare caratteri contro un limite fissato da qualcun altroUn'emoji vale 1 carattere, o 7, o 11, o 25, a seconda di chi conta. Quale intendono il tuo modulo, il tuo database e il tuo gateway SMS — e un test con un solo incolla per capire con quale hai a che fare.SpiegazioneCome funzionano davvero i font di Instagram (non sono font)Nulla viene formattato. Ogni lettera è sostituita da un diverso carattere Unicode che sembra grassetto o corsivo, ed è per questo che uno screen reader legge un guazzabuglio e alcuni dispositivi mostrano quadratini vuoti.SpiegazioneRilevare la lingua di un testo, e perché i testi brevi fallisconoMisurato, non affermato: 90 frasi brevi reali in sei lingue, nessuna rifiutata e 68 giuste — il 76%, che scende al 64% sotto le sedici lettere. Quattro delle risposte sbagliate sono tornate con il 100% di fiducia.TutorialNumerare le righe di un testo per una revisione a più maniLa numerazione parte da 1 e non si può impostare a 0, l'allineamento usa spazi e non zeri, e lo strumento che li toglie annulla otto degli undici separatori senza toccare l'indentazione. Quello che ancora non sa fare è distinguere i tuoi numeri dai suoi.SpiegazioneMaiuscolo di frase e maiuscolo di titolo: le regole cambiano con la linguaIl maiuscolo di titolo inglese ha tre soglie diverse a seconda del manuale di stile. Francese, spagnolo, portoghese e italiano non ne hanno nessuna. Il tedesco scrive maiuscolo ogni sostantivo. Lo strumento non sa nulla di tutto ciò: ecco esattamente cosa fa.

Strumenti correlati

Fonti

Hai notato un errore in questo articolo?