Vai al contenuto principale
⚖️ Standard tra linguaggi Standard: Unicode Standard Annex #15 / W3C Character Model Tempo: 8 min di lettura Revisionato: ottobre 2026

Normalizzazione Unicode: NFC, NFD, NFKC e NFKD spiegati

Quando e come normalizzare le stringhe Unicode per confronti affidabili, interrogazioni al database e corrispondenza sicura degli identificatori utente.

TL;DR — Risposta diretta

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.

💡
Regola di produzione: Utilizzare sempre NFC (Normalization Form C) per l'input web, l'archiviazione nel database e la corrispondenza degli identificatori. Usare NFD solo per l'indicizzazione di ricerca senza accenti, e NFKC/NFKD con cautela, perché le forme di compatibilità alterano la formattazione semantica.

Equivalenza canonica e confronto di stringhe con String.prototype.normalize()

JAVASCRIPT normalization-demo.js
// 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
Output del programma
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)

Lo standard per il World Wide Web. I caratteri vengono decomposti e quindi ricomposti in caratteri precomposti ovunque sia possibile. La «e» + accento acuto combinante diventa la «é» precomposta (U+00E9).

NFD (Normalization Form D: decomposizione canonica)

I caratteri vengono decomposti nei caratteri base e nei caratteri combinanti secondo un ordine standardizzato. La «é» precomposta (U+00E9) diventa «e» (U+0065) + accento acuto combinante (U+0301). Ottima per rimuovere gli accenti negli indici di ricerca.

NFKC (Normalization Form KC: decomposizione di compatibilità seguita da composizione canonica)

Applica la decomposizione di compatibilità prima di comporre. Le legature come «fi» diventano «fi», il «①» cerchiato diventa «1» e l'apice «²» diventa «2». Utile per l'indicizzazione di ricerca, ma distruttivo per l'archiviazione generale.

NFKD (Normalization Form KD: decomposizione di compatibilità)

Applica la decomposizione di compatibilità senza ricomposizione.

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.
DA EVITARE: ❌ Confrontare l'input utente non elaborato
// Attacker registers 'admin' with decomposed characters
if (dbUser === req.body.username) {
  // Can be bypassed or duplicated with visually identical strings!
}
Perché fallisce: I duplicati visivi con punti di codice diversi possono aggirare i vincoli di unicità o creare account duplicati.
CONSIGLIATO: ✅ Normalizzare in NFC al momento dell'acquisizione
const cleanUsername = req.body.username.normalize('NFC');
// Query DB with cleanUsername
Perché è migliore: Garantisce che tutte le stringhe canonicamente equivalenti corrispondano a chiavi binarie identiche.

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 Consortium

Unicode Standard Annex #15: Unicode Normalization Forms

Clausola: §1 Normalization Forms

W3C

Character Model for the World Wide Web: String Matching

Clausola: §3 Normalization