Intermédiaire 8 min de lecture 25 janvier 2025

Hair space (U+200A) : comprendre, détecter et corriger

Un tout petit espace peut provoquer de gros ennuis. Le hair space (U+200A) est si fin qu’il passe inaperçu à l’œil nu, mais il brise des comparaisons, fausse des parsings et perturbe des exports. Voici comment il arrive dans vos textes, comment l’identifier rapidement et comment le supprimer proprement.

Qu'est-ce que le hair space (U+200A) ?

C’est un espace typographique extrêmement fin. Il n’est pas à largeur zéro, mais sa largeur minuscule le rend presque invisible et difficile à repérer à l’écran.

Pour situer le hair space parmi les autres espaces, voici un rappel utile :

1 Espaces ASCII classiques (référence face au hair space)

Ceux que la plupart des fonctions gèrent par défaut, contrairement à U+200A.

Espace (32), Tab (9), CR (13), LF (10)

2 Caractères de contrôle ASCII (à ne pas confondre avec U+200A)

Codes 0 à 31 et 127, absence d’emprise visuelle mais rôles techniques; le hair space n’en fait pas partie.

NUL (0), BEL (7), ESC (27), DEL (127)

3 Espaces Unicode étroits (dont le hair space)

Ceux qui ressemblent au hair space et prêtent à confusion :

Hair Space (U+200A) - Espace très fin
Thin Space (U+2009) - Espace fine
Six-Per-Em Space (U+2006) - Six par cadratin
NBSP (U+00A0) - Espace insécable, plus large

4 Marques techniques souvent rencontrées à côté

Différentes du hair space mais fréquemment mêlées dans les contenus copiés/collés :

BOM (U+FEFF) - Byte Order Mark
Soft Hyphen (U+00AD) - Tiret conditionnel
LRM, RLM, LRE, RLE - Contrôles Bidi

Problèmes courants avec le hair space

Copier-coller depuis le web ou Word

Ajoute des hair spaces minuscules entre chiffres, autour d’emails ou d’URL, et casse des parsings CSV ou des scripts.

Tests unitaires qui échouent

Une chaîne contient U+200A, invisible dans le diff, et les comparaisons strictes échouent.

Trim() ou strip() inefficace

Beaucoup de fonctions ne suppriment pas U+200A par défaut, contrairement à l’espace ASCII.

Regex \s ou \w incomplètes

Sans mode Unicode, U+200A peut ne pas être capturé par \s et perturber vos correspondances.

Exemple de problème avec U+200A :

# Chaînes visuellement identiques, mais différentes en mémoire
string1 = "email@domain.com"
string2 = "email@domain.com " # Contient un hair space (U+200A) en fin
assert string1 == string2 # ❌ Échec

Symptômes typiques d’un hair space

🚨 Signaux d'alarme

!
Un diff git annonce des changements invisibles, un hair space s'est glissé dans une ligne
!
Un parseur CSV échoue car "1 000" (avec hair space) est lu comme texte
!
Un .env refuse une clé à cause d’un hair space en début ou fin de ligne
!
Le curseur de l’éditeur fait un micro-saut entre caractères sans raison apparente
!
Une commande collée dans le terminal retourne "command not found" à cause d’un U+200A

Comment détecter le hair space

Solution recommandée : Clean ASCII

Clean ASCII détecte immédiatement le hair space (U+200A) et autres espaces typographiques proches. L’analyse affiche les positions exactes, les codes Unicode et des actions rapides pour les remplacer.

✅ Détection automatique

Hair space U+200A, thin space, NBSP, soft hyphens, contrôles

📊 Analyse complète

Codepoint, positions précises, proposition de remplacement

🧹 Nettoyage automatique

Remplacement du hair space par espace normal ou suppression

💾 Export propre

Téléchargement du texte nettoyé prêt à l’emploi

Autres méthodes de détection

Affichage dans l'éditeur

Activez "render whitespace" ou "show invisibles" et recherchez U+200A
Cherchez le motif \u200A dans l’outil de recherche de l’IDE

En ligne de commande (Unix)

# Trouver les hair spaces (U+200A) dans un fichier
grep -Pn "\x{200A}" fichier.txt
# Visualiser fins de ligne et tabulations (et repérer les espaces suspects)
sed -n l fichier.txt
# Afficher les caractères non imprimables
cat -A fichier.txt
# Inspecter les octets (U+200A = E2 80 8A en UTF-8)
hexdump -C fichier.txt | grep "e2 80 8a"

En code

JavaScript

const hasHairSpace = /\u200A/.test(str)

Python

positions = [i for i,c in enumerate(s) if c == "\u200A"]

Excel / Google Sheets

SUBSTITUE(A1;CAR(8202);"")

Nettoyer et prévenir les hair spaces

🚀 Solution rapide avec Clean ASCII

Avant d’écrire du code, utilisez Clean ASCII pour retirer immédiatement tous les hair spaces U+200A présents dans vos textes et fichiers.

Détection des U+200A
Remplacement/suppression ciblée
Export immédiat

Méthodes techniques avancées

🔧 Normaliser

Appliquez une table de mapping: remplacez U+200A par espace ASCII ou rien selon le contexte
NFC/NFKC ne modifient pas le hair space : prévoyez un remplacement explicite
Unifiez les fins de ligne et l’encodage pour éviter les surprises annexes

🧹 Filtrer

Écrivez une fonction trim_all() qui retire aussi U+200A
Remplacez systématiquement les hair spaces par un espace simple si pertinent
Bloquez les caractères de contrôle indésirables pour limiter les effets combinés

⚙️ Automatiser

Ajoutez un hook pre-commit qui interdit U+200A via regex ou script
Vérifiez les entrées utilisateur et nettoyez les hair spaces à l’ingestion
Intégrez un linter de caractères dans la CI pour empêcher U+200A de passer

Checklist rapide

Fichiers en UTF-8 sans BOM, contrôlés contre U+200A
Fins de ligne uniformes via gitattributes pour stabiliser les diffs
Affichage des espaces et caractères spéciaux activé dans l’éditeur
Fonction de nettoyage qui remplace/supprime le hair space (U+200A)
Tests de validation garantissant l’absence de U+200A dans les données
Consignes claires pour éviter l’introduction de hair spaces via copier-coller

Conclusion

Le hair space est discret, mais ses effets ne le sont pas. Le détecter tôt vous évite des heures d’investigation.

Ajoutez une étape de détection, remplacez systématiquement U+200A quand il n’a pas de valeur typographique, et sécurisez vos flux.

Détectez le hair space maintenant

Utilisez notre outil pour identifier et nettoyer les hair spaces dans vos textes.

Analyser mon texte