Intermédiaire 8 min de lecture 25 janvier 2025

ZWSP (Zero Width Space) : le caractère invisible qui perturbe vos textes

Tout semble normal, mais un import CSV explose, une comparaison échoue ou un lien ne fonctionne plus. ZWSP (U+200B), un espace de largeur nulle, est souvent en cause. Il ne se voit pas, mais il modifie vos chaînes. Voici comment le comprendre, le repérer et s’en débarrasser durablement.

Qu'est-ce que ZWSP (Zero Width Space) ?

ZWSP est un séparateur de mots de largeur nulle : présent dans la chaîne, il n’affiche rien mais influence les sauts de ligne et les traitements texte.

Points essentiels à connaître sur ZWSP :

1 Définition, codepoint et octets

ZWSP est U+200B, un séparateur Unicode sans rendu visuel.

Unicode: U+200B • UTF-8: E2 80 8B • HTML: ​ • JS: "\u200B"

2 Pourquoi il ne se voit pas

ZWSP a une largeur visuelle nulle et peut être ignoré par l’affichage, mais il reste compté dans la chaîne.

Longueur("a\u200Bb") == 3 // "a", ZWSP, "b"

3 D’où vient ZWSP ?

On l’attrape surtout lors de copier-coller depuis des pages web, des CMS, ou des éditeurs qui insèrent des séparateurs invisibles.

Copier un texte justifié depuis un site
Correcteurs/OS mobiles qui ajoutent des séparateurs
Formats riches (HTML, DOCX) nettoyés en texte
Snippets ou contenus traduits/normalisés

4 Proches cousins souvent confondus

ZWSP n’est pas le seul séparateur invisible, attention aux confusions :

ZWNJ (U+200C) - Zero Width Non-Joiner
WJ (U+2060) - Word Joiner (empêche une coupure)
ZWNBSP / BOM (U+FEFF) - historiquement confondu avec ZWSP
Soft Hyphen (U+00AD) - Tiret conditionnel, parfois invisible

Problèmes classiques liés à ZWSP

Copier-coller depuis le web

Insère des ZWSP dans des emails, URLs ou identifiants, provoquant des erreurs invisibles.

Tests unitaires qui échouent

Une chaîne contient U+200B, les égalités strictes ou hachages ne correspondent plus.

Trim() ou strip() inefficace

Les fonctions basiques ignorent U+200B qui n’est pas un espace ASCII classique.

Regex \s ou \w incomplètes

Certains moteurs n’incluent pas U+200B dans \s ; il faut cibler explicitement le codepoint.

Exemple de problème courant :

# Deux chaînes paraissent identiques mais ne le sont pas
string1 = "email@domain.com"
string2 = "email@domain.com​" # Contient U+200B à la fin
assert string1 == string2 # ❌ Échec

Symptômes qui doivent vous alerter

🚨 Signes typiques de la présence de ZWSP

!
Un diff git annonce des changements invisibles ligne par ligne
!
Un split() ou un parse CSV ne retombe pas sur le bon nombre de colonnes
!
Un .env ou une clé d’API est rejeté alors que la ligne a l’air correcte
!
Le curseur semble “bloquer” ou sauter dans l’éditeur sans raison
!
Un copier-coller en terminal produit une commande invalide ou introuvable

Comment détecter ZWSP

Solution recommandée : Clean ASCII

Clean ASCII détecte automatiquement ZWSP (U+200B) et les autres séparateurs invisibles. Il affiche leurs positions exactes et facilite leur suppression en un clic.

✅ Détection automatique

ZWSP, ZWNJ, WJ, soft hyphens, caractères de contrôle

📊 Analyse détaillée

Codepoint, octets UTF-8, positions, impact potentiel

🧹 Nettoyage ciblé

Suppression de U+200B et remplacements adaptés aux besoins

💾 Export propre

Téléchargement du texte nettoyé prêt à intégrer

Autres méthodes de détection

Affichage dans l'éditeur

Activez “render whitespace” / “show invisibles” (VS Code, JetBrains, Sublime)
Ajoutez une extension qui met en évidence U+200B et U+FEFF

En ligne de commande (Unix)

# Rechercher U+200B (ZWSP) en Unicode
grep -nP "\x{200B}" fichier.txt
# Rechercher les octets UTF-8 de ZWSP
grep -nUaP "\xE2\x80\x8B" fichier.txt
# Visualiser les caractères de contrôle et fins de ligne
cat -A fichier.txt
# Inspecter en hexadécimal
hexdump -C fichier.txt | grep "e2 80 8b"

En code

JavaScript

const hasZWSP = /\u200B/.test(str);
const cleaned = str.replace(/\u200B/g, "");

Python

has_zwsp = "\u200b" in s
cleaned = s.replace("\u200b", "")

Excel / Google Sheets

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

Nettoyer ZWSP et prévenir sa réintroduction

🚀 Solution rapide avec Clean ASCII

Avant d’écrire des scripts, ouvrez votre texte dans Clean ASCII pour détecter et supprimer immédiatement ZWSP (U+200B).

Détection de U+200B
Nettoyage ciblé sans altérer le reste
Export immédiat

Méthodes techniques avancées

🔧 Normaliser

Appliquez NFC/NFKC pour homogénéiser les formes (ne supprime pas ZWSP mais stabilise le reste)
Évitez d’utiliser U+FEFF (ZWNBSP/BOM) comme ZWSP ; supprimez les BOM en UTF-8
Uniformisez les fins de ligne (gitattributes, dos2unix) pour des diffs lisibles

🧹 Filtrer

Écrivez des fonctions strip_zwsp() qui retirent U+200B partout
Nettoyez les entrées utilisateurs et les champs sensibles (emails, URLs, IDs)
Bloquez les caractères de contrôle hors CR/LF/TAB et U+200B dans vos parsers

⚙️ Automatiser

Hooks pre-commit pour refuser les fichiers contenant U+200B
Sanitisation des inputs en backend et dans les formulaires
Linting en CI pour détecter ZWSP et fail si présent

Checklist rapide

Fichiers en UTF-8 sans BOM, pas de U+FEFF parasite
Fins de ligne uniformes pour faciliter la détection de ZWSP
Affichage des invisibles activé dans l’éditeur
Fonction utilitaire pour retirer U+200B dans vos libs
Tests qui valident l’absence de ZWSP dans les champs critiques
Documentation interne sur ZWSP et autres séparateurs invisibles

Conclusion

ZWSP est discret mais impactant. En l’ayant à l’œil, vous évitez des heures de debug et des erreurs silencieuses.

Mettez en place une détection systématique de U+200B, nettoyez vos flux et standardisez vos outils pour neutraliser ces surprises.

Détectez ZWSP dans vos textes

Utilisez notre outil pour identifier et supprimer U+200B sans modifier le reste de votre contenu.

Analyser et nettoyer ZWSP