Intermédiaire 8 min de lecture 25 janvier 2025

Diacritic marks et problèmes courants dans vos textes

Vos chaînes semblent identiques mais ne correspondent pas, vos tris se comportent étrangement, vos slugs se dédoublent. Les diacritic marks sont souvent en cause : lettres accentuées précomposées ou caractères combinants. Comprendre la normalisation Unicode et la détection de ces signes vous fait gagner un temps précieux.

Qu'est-ce qu'un diacritic mark ?

Ce sont des marques qui modifient le son ou le sens d’une lettre (accents, cédilles, trémas, tildes), sous forme précomposée ou combinante.

Voici les principales familles de diacritic marks et formes associées :

1 Lettres précomposées Unicode

Caractères monocode intégrant la lettre et l’accent.

é (U+00E9), à (U+00E0), ñ (U+00F1), ö (U+00F6)

2 Caractères combinants (combining marks)

S’appliquent à la lettre précédente pour former le caractère accentué.

COMBINING ACUTE (U+0301), DIAERESIS (U+0308), CEDILLA (U+0327), TILDE (U+0303)

3 Diacritiques et combinaisons moins courants

Les plus problématiques pour les développeurs :

COMBINING CARON (U+030C)
COMBINING RING ABOVE (U+030A)
COMBINING DOT BELOW (U+0323)
COMBINING MACRON (U+0304)

4 Marques techniques et normalisation

Formes et marqueurs influençant la gestion des diacritiques :

NFC / NFD - Formes de normalisation canoniques
NFKC / NFKD - Formes de compatibilité
ZWJ (U+200D), ZWNJ (U+200C) - Joiners
Variation Selectors (U+FE0E, U+FE0F)

Problèmes classiques

Copier-coller hétérogène NFC/NFD

Mélange de lettres précomposées et combinantes dans CSV, JSON ou code.

Tests unitaires qui échouent

"é" (U+00E9) vs "e" + U+0301 : visuellement identiques, binaires différents.

Lowercase/uppercase incohérents

mb_strtolower(), locale et normalisation peuvent donner des résultats inattendus.

Regex \w incomplètes

Selon le moteur, \w n’inclut pas toutes les lettres avec accents.

Exemple de problème courant :

# Chaînes qui semblent identiques mais diffèrent
string1 = "café"
string2 = "café" # 'e' + U+0301 (accent aigu combinant)
assert string1 == string2 # ❌ Échec

Symptômes qui doivent vous alerter

🚨 Signaux d'alarme

!
Un diff git affiche des changements invisibles après un copier-coller
!
Des tris ou recherches donnent des résultats incohérents selon l’environnement
!
Un slug "cafe" se retrouve dupliqué avec "café" malgré vos protections
!
La recherche "resume" ne trouve pas "résumé" dans la BDD
!
Des validations [A-Za-z] rejettent "é", "ç", "ñ"

Comment les détecter

Solution recommandée : Clean ASCII

Clean ASCII détecte précisément les diacritic marks, distingue lettres précomposées et caractères combinants, et met en évidence les séquences nécessitant une normalisation.

✅ Détection automatique

Combining marks, lettres précomposées, séquences mixtes NFC/NFD

📊 Analyse complète

Points de code, positions exactes, propositions de normalisation

🧹 Nettoyage automatique

Normalisation en NFC et option de suppression des diacritiques

💾 Export propre

Texte normalisé et/ou translittéré prêt à l’emploi

Autres méthodes de détection

Affichage dans l'éditeur

Activez l’affichage des points de code/Unicode highlight dans VS Code, JetBrains, Sublime
Installez un linter qui signale les caractères combinants et les mélanges NFC/NFD

En ligne de commande (Unix)

# Localiser les caractères combinants
grep -P "\p{M}" fichier.txt
# Normaliser en NFC (ICU)
uconv -x any-nfc -o normalise.txt fichier.txt
# Comparer NFC vs NFD
diff <(uconv -x any-nfc fichier.txt) <(uconv -x any-nfd fichier.txt)
# Inspecter les points de code
hexdump -C fichier.txt

En code

JavaScript

Array.from(str.normalize('NFD')).map(c => c.codePointAt(0).toString(16))

Python

[f"{ord(c):04x}" for c in __import__("unicodedata").normalize("NFD", s) if __import__("unicodedata").combining(c)]

Excel / Google Sheets

UNICODE(MID(cellule;position;1))

Nettoyer et prévenir

🚀 Solution rapide avec Clean ASCII

Avant de coder des traitements complexes, utilisez Clean ASCII pour normaliser et maîtriser vos diacritic marks en quelques clics :

Détection des caractères combinants
Normalisation NFC/NFD
Export translittéré/ASCII

Méthodes techniques avancées

🔧 Normaliser

Utilisez Unicode NFC/NFKC pour stocker des lettres accentuées cohérentes
Décomposez en NFD/NFKD pour filtrer ou comparer sans accents
Choisissez une collation insensible aux accents pour recherche/tri

🧹 Filtrer

Écrivez des fonctions remove_diacritics() pour enlever les combining marks
Translittérez ł → l, ß → ss, ø → o pour les slugs
Bloquez les mélanges NFC/NFD dans les champs critiques

⚙️ Automatiser

Hooks pre-commit qui normalisent en NFC et refusent les combining inattendus
Tests de sanitation pour inputs utilisateurs (accent/diacritiques)
Linting Unicode et normalisation dans la CI

Checklist rapide

Texte stocké en Unicode NFC de manière uniforme
Normalisation dès l’entrée (APIs, formulaires, ETL)
Collations accent-insensibles pour recherche/tri lorsque nécessaire
Fonctions centralisées remove_diacritics/slugify
Tests empêchant les caractères combinants indésirables
Documentation développeurs sur Unicode, normalisation et collations

Conclusion

Les diacritic marks sont discrets mais déterminants. En les maîtrisant, vous évitez des écarts de tri, de recherches et des comparaisons fallacieuses.

Normalisez systématiquement, surveillez les caractères combinants et alignez vos collations pour réduire la quasi‑totalité des problèmes liés aux accents.

Détectez les diacritic marks maintenant

Utilisez notre outil pour identifier, normaliser et nettoyer les diacritiques dans vos textes.

Analyser mon texte