Risposta tecnica diretta
La normalizzazione Unicode converte stringhe visivamente equivalenti in una sequenza binaria unica e deterministica, così che l'uguaglianza tra stringhe (===) e le interrogazioni al database funzionino correttamente. Le quattro forme di normalizzazione ufficiali sono NFC, NFD, NFKC e NFKD.
Equivalenza canonica e confronto di stringhe con String.prototype.normalize()
// 1. Precomposed 'é' (U+00E9) vs Decomposed 'e' + acute (U+0065 U+0301)
const s1 = '\u00E9'; // é
const s2 = 'e\u0301'; // e + accent
console.log(s1 === s2); // false (different byte sequences!)
console.log(s1.length); // 1
console.log(s2.length); // 2
// 2. Normalizing to NFC (Canonical Composition)
const n1 = s1.normalize('NFC');
const n2 = s2.normalize('NFC');
console.log(n1 === n2); // true!
console.log(n1.length); // 1
false
1
2
true
1
Le quattro forme di normalizzazione
Unicode definisce due tipi di equivalenza: l'equivalenza canonica (identità visiva e funzionale esatta) e l'equivalenza di compatibilità (differenze di formattazione come pedice, apice, cerchiato o legatura).
NFC (Normalization Form C: decomposizione canonica seguita da composizione canonica)
NFD (Normalization Form D: decomposizione canonica)
NFKC (Normalization Form KC: decomposizione di compatibilità seguita da composizione canonica)
NFKD (Normalization Form KD: decomposizione di compatibilità)
Errori comuni vs modelli di produzione
Scopri quali modelli falliscono in produzione e le alternative moderne conformi agli standard.
Confrontare nomi utente o password
Autenticazione, registrazione di account, interrogazioni al database.// Attacker registers 'admin' with decomposed characters
if (dbUser === req.body.username) {
// Can be bypassed or duplicated with visually identical strings!
}
const cleanUsername = req.body.username.normalize('NFC');
// Query DB with cleanUsername
Matrice dei casi limite e invarianti
Una matrice di test diversificata che confronta il comportamento dei caratteri tra ASCII, segni combinanti, emoji, bandiere e frammenti surrogati.
| Caso di test | Glifo di input | Unità di codice | Punti di codice | Grafemi | Categoria | Spiegazione tecnica |
|---|---|---|---|---|---|---|
| Precomposto contro decomposto | é (U+00E9) vs e + \u0301 |
—
|
—
|
—
|
Canonical Equivalence | Entrambe le uscite NFC risultano strettamente uguali (===) dopo la normalizzazione. |
| Numero cerchiato | ① (U+2460) |
—
|
—
|
—
|
Compatibility Equivalence | NFC preserva lo stile cerchiato; NFKC lo decompone nella cifra ASCII 1. |
| Legatura | fi (U+FB01) |
—
|
—
|
—
|
Compatibility Equivalence | NFC conserva il carattere di legatura; NFKC lo espande in due lettere ASCII separate. |
Standard e provenienza delle fonti
Tutti gli invarianti tecnici, le API e i comportamenti di questa guida sono verificati rispetto alle specifiche primarie ufficiali.
Unicode Standard Annex #15: Unicode Normalization Forms
Clausola: §1 Normalization Forms
Character Model for the World Wide Web: String Matching
Clausola: §3 Normalization