Perché testi che sembrano identici non lo sono
Unicode ha più di 150.000 caratteri e molti sono invisibili o sembrano esattamente un altro. Una stringa copiata da una pagina web, un PDF o un’app di chat può contenere spazi a larghezza zero, spazi unificatori, trattini morbidi, marcatori di direzione e un byte order mark, nessuno dei quali si vede sullo schermo, e tutti fanno fallire confronti, login e ricerche nei database. I sosia sono peggio: la а cirillica (U+0430) è identica pixel per pixel alla a latina (U+0061) nella maggior parte dei font, ed è la base dei domini di phishing omografi e dei ticket «perché questo nome utente non esiste».
Cosa riporta l’ispettore
- Code point (
U+00E9): il numero che Unicode assegna. Un carattere visibile può essere un solo code point (éprecomposta) o due (e+ accento acuto combinante), che è la distinzione NFC/NFD. - Byte UTF-8: 1–4 byte per code point; ciò che viene memorizzato in file, database e HTTP. Unità UTF-16: ciò che contano le stringhe JavaScript e Java; le emoji ne occupano due.
- Grafemi: ciò che una persona vede come un carattere. Un’emoji bandiera è un grafema, due code point, otto byte UTF-8.
Normalizzazione
NFC compone base + segno in un unico code point dove esiste; NFD decompone. Confronta e memorizza il testo in NFC (i nomi di file di macOS arrivano in NFD, un classico bug di sincronizzazione). NFKC e NFKD inoltre ripiegano i caratteri di compatibilità: legature, lettere a larghezza intera, apici e numeri romani diventano i loro equivalenti semplici, che è ciò che serve per ricerca e identificatori ma distrugge la formattazione.
Pulire l’input
Per identificatori, nomi utente e domini: normalizza in NFKC, elimina i caratteri che questo strumento segnala come invisibili, e rifiuta o avvisa in caso di script misti. L’opzione «nascondi invisibili» ti dà la stringa pulita da copiare.
Domande
Cos’è uno spazio a larghezza zero?
U+200B, un carattere senza larghezza usato per indicare un possibile punto di a capo. Sopravvive al copia-incolla ed è invisibile in quasi ogni editor. Lo inseriscono elaboratori di testo, Slack e alcune pagine web; questo ispettore li segnala tutti.
Perché «é» a volte conta come due caratteri?
Può essere scritta come il singolo code point U+00E9 oppure come U+0065 e seguita da U+0301 accento acuto combinante. Appaiono uguali ma risultano diverse al confronto, a meno che entrambe siano normalizzate in NFC.
Come digito un carattere dal code point?
Linux (GTK): Ctrl+Shift+U, poi l’hex, poi spazio. macOS: abilita la sorgente di input Unicode Hex e tieni premuto Option. Windows: scrivi l’hex e poi Alt+X in Word e WordPad. Nel codice: "\u{1F600}" (JS), "\N{...}" o "\U0001F600" (Python).
Che differenza c’è tra UTF-8 e Unicode?
Unicode è il catalogo dei caratteri e dei loro numeri. UTF-8 (e UTF-16, UTF-32) è un modo di scrivere quei numeri come byte. UTF-8 è quello usato ovunque sul web.