Réponse technique directe
La normalisation Unicode convertit des chaînes visuellement équivalentes en une séquence binaire unique et déterministe, afin que l'égalité de chaînes (===) et les requêtes en base de données fonctionnent avec précision. Les quatre formes de normalisation officielles sont NFC, NFD, NFKC et NFKD.
Équivalence canonique et comparaison de chaînes avec 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
Les quatre formes de normalisation
Unicode définit deux types d'équivalence : l'équivalence canonique (identité visuelle et fonctionnelle exacte) et l'équivalence de compatibilité (différences de mise en forme comme l'indice, l'exposant, le cerclage ou la ligature).
NFC (Normalization Form C : décomposition canonique suivie d'une composition canonique)
NFD (Normalization Form D : décomposition canonique)
NFKC (Normalization Form KC : décomposition de compatibilité suivie d'une composition canonique)
NFKD (Normalization Form KD : décomposition de compatibilité)
Erreurs courantes vs modèles de production
Découvrez quels modèles échouent en production et leurs alternatives modernes conformes aux standards.
Comparer des noms d'utilisateur ou des mots de passe
Authentification, création de comptes, requêtes en base de données.// 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 des cas limites et invariants
Une matrice de tests diversifiée comparant le comportement des caractères entre ASCII, signes combinants, emojis, drapeaux et fragments de substitution.
| Cas de test | Glyphe d'entrée | Unités de code | Points de code | Graphèmes | Catégorie | Explication technique |
|---|---|---|---|---|---|---|
| Précomposé contre décomposé | é (U+00E9) vs e + \u0301 |
—
|
—
|
—
|
Canonical Equivalence | Les deux sorties NFC sont strictement égales (===) après normalisation. |
| Nombre cerclé | ① (U+2460) |
—
|
—
|
—
|
Compatibility Equivalence | NFC préserve le style cerclé ; NFKC le décompose en le chiffre ASCII 1. |
| Ligature | fi (U+FB01) |
—
|
—
|
—
|
Compatibility Equivalence | NFC conserve le caractère de ligature ; NFKC le développe en deux lettres ASCII distinctes. |
Normes et provenance des sources
Tous les invariants techniques, API et comportements de ce guide sont vérifiés par rapport aux spécifications primaires officielles.
Unicode Standard Annex #15: Unicode Normalization Forms
Clause : §1 Normalization Forms
Character Model for the World Wide Web: String Matching
Clause : §3 Normalization