Intermédiaire 8 min de lecture 25 janvier 2025

zero width space (ZWSP) : tout comprendre pour éviter les pièges

Vos chaînes se ressemblent mais ne sont pas égales, vos CSV décalent des colonnes, vos parsers échouent sans raison apparente. Le coupable est souvent le zero width space. Il ne se voit pas, mais il modifie vos données. Voici comment l'identifier, pourquoi il apparaît et comment s'en débarrasser proprement.

Qu'est-ce que le zero width space ?

C'est un séparateur Unicode de largeur nulle. Il ne produit aucune trace visuelle tout en étant bel et bien présent dans la chaîne.

Points essentiels à connaître sur le zero width space et ses proches :

1 Identité et propriétés

ZWSP est un séparateur de mots qui n'occupe aucune largeur à l'écran.

ZWSP (U+200B) • UTF-8: E2 80 8B • Catégorie: Cf (Other, Format)

2 Confusions fréquentes

Plusieurs caractères ressemblent à ZWSP par leurs effets invisibles.

ZWNBSP/BOM (U+FEFF) - Obsolète comme espace, encore rencontré
ZWJ (U+200D) et ZWNJ (U+200C) - Jonction/non-jonction
NBSP (U+00A0) - Insécable, visible comme espace
Hair/Thin Space (U+200A/U+2009) - Espaces très fins

3 Où se glisse-t-il ?

Les scénarios d'introduction les plus courants :

Copier-coller depuis le web, Slack, Word, PDF
Contenus CMS avec plugins de typographie
Sanitizers incomplets ou normalisations partielles
Collage d'emoji/RTL, raccourcis clavier d'éditeurs

4 Effets techniques à connaître

ZWSP peut modifier des comportements sans rien afficher :

Change la longueur apparente vs réelle
Fait échouer des matches exacts et des tris
Peut couper des mots en rendu mais pas en données
Pollue des identifiants, emails, URLs, clés .env

Problèmes classiques

Copier-coller depuis le web ou Word

Ajoute des ZWSP au milieu de mots, d'emails ou de numéros, cassant CSV, requêtes ou commandes.

Tests unitaires qui échouent

Une chaîne contient un ZWSP invisible (U+200B) qui fait capoter une égalité stricte.

Trim() ou strip() inefficace

Beaucoup de fonctions ne suppriment pas U+200B par défaut, d'où des blancs « fantômes ».

Regex \s ou \w incomplètes

Selon le moteur, ZWSP n'est pas capturé par \s. Les traitements passent à côté et laissent U+200B.

Exemple de problème courant :

# Deux emails semblent identiques…
string1 = "email@domain.com"
string2 = "email@domain.com​" # Contient U+200B à la fin
assert string1 == string2 # ❌ Échec

Symptômes qui doivent vous alerter

🚨 Signaux d'alarme

!
Un diff git met tout en rouge alors que rien ne bouge à l'œil — probable zero width space inséré
!
Un split() ou un parse CSV retombe sur un comptage de colonnes incohérent à cause d'U+200B
!
Une clé .env ou un identifiant refuse d'être lu — ZWSP en fin de ligne ou au milieu
!
Le curseur « saute » dans l'éditeur ou révèle un marqueur invisible en se déplaçant
!
Un copier-coller dans le terminal produit une commande invalide — ZWSP entre deux lettres

Comment les détecter

Solution recommandée : Clean ASCII

Clean ASCII détecte immédiatement le zero width space et le met en évidence, avec sa position exacte. L'outil liste les caractères non-ASCII problématiques et propose un remplacement sûr pour assainir vos données.

✅ Détection automatique

zero width space (U+200B), ZWJ, ZWNJ, NBSP, BOM, caractères de contrôle

📊 Analyse complète

Codes Unicode, positions, contexte d'apparition, propositions de correction

🧹 Nettoyage automatique

Suppression de ZWSP et conversion vers des équivalents ASCII quand c'est pertinent

💾 Export propre

Téléchargement du texte nettoyé prêt pour vos pipelines

Autres méthodes de détection

Affichage dans l'éditeur

Activez "show invisibles" / "render whitespace" pour voir ZWSP sous forme de marqueur
Installez un linter qui surligne U+200B dans les fichiers texte et le code

En ligne de commande (Unix)

# Repérer U+200B et autres hors ASCII
grep -P "[^\x09\x0A\x0D\x20-\x7E]" fichier.txt
# Voir les fins de ligne et tabulations
sed -n l fichier.txt
# Afficher les caractères de contrôle
cat -A fichier.txt
# Voir les codes hexadécimaux
hexdump -C fichier.txt

En code

JavaScript

Array.from(str).reduce((idx,c,i)=> c==='\u200B'?[...idx,i]:idx,[])

Python

[i for i,c in enumerate(s) if c == '\u200b']

Excel / Google Sheets

SUBSTITUE(cellule;UNICHAR(8203);"")

Nettoyer et prévenir

🚀 Solution rapide avec Clean ASCII

Avant d'écrire un script, testez Clean ASCII : l'outil détecte immédiatement le zero width space et le supprime sans altérer le reste.

Détection de U+200B
Nettoyage ciblé et sûr
Export immédiat

Méthodes techniques avancées

🔧 Normaliser

Appliquez Unicode NFC/NFKC pour homogénéiser, puis filtrez U+200B explicitement
Retirez les BOM inutiles (U+FEFF) des fichiers UTF-8
Uniformisez les fins de ligne (dos2unix, gitattributes)

🧹 Filtrer

Écrivez une fonction remove_zwsp() pour supprimer U+200B partout
Remplacez ZWSP par vide dans emails, URLs, identifiants
Bloquez les caractères de formatage invisibles en entrée utilisateur

⚙️ Automatiser

Hooks pre-commit refusant les fichiers contenant U+200B
Tests de sanitation garantissant l'absence de ZWSP dans les données critiques
Linting dans la CI pour repérer les caractères invisibles

Checklist rapide

Fichiers en UTF-8 sans BOM (évite U+FEFF parasite)
Fins de ligne uniformes via gitattributes
Affichage des invisibles activé dans l'éditeur (ZWSP visible)
Fonction de suppression U+200B dans vos libs utilitaires
Tests garantissant l'absence de caractères de formatage invisibles
Consignes développeurs sur ZWSP, NBSP et normalisation

Conclusion

Le zero width space est discret mais redoutable. En le maîtrisant, vous économisez des heures de débogage et stabilisez vos pipelines.

Mettez en place une détection systématique d'U+200B, nettoyez à l'entrée et normalisez vos flux pour éliminer la majorité des surprises.

Repérez le zero width space maintenant

Utilisez notre outil pour identifier et supprimer U+200B et autres caractères invisibles dans vos textes.

Analyser mon texte