Intermédiaire 8 min de lecture 25 janvier 2025

Tiret long (—) : usages, encodage et pièges fréquents

Le tiret long — aussi appelé em dash — est utile en typographie, mais peut casser vos slugs, faire échouer des comparaisons de chaînes ou perturber des parsers. Entre trait d’union, demi‑cadratin et cadratin, la confusion est courante. Voici comment reconnaître le tiret long, l’employer correctement et éviter les soucis en développement.

Qu'est-ce que le tiret long (—) ?

C’est le caractère Unicode em dash U+2014, visuellement plus long que le trait d’union. Il sert aux incises, aux ruptures de phrase et à certaines conventions éditoriales.

Autour du tiret long, voici les notions à connaître :

1 Tirets et signes voisins

Ils se ressemblent mais n’ont pas la même sémantique ni le même code.

Hyphen-minus (-, U+002D), En dash (–, U+2013), Em dash (—, U+2014), Minus sign (−, U+2212)

2 Confusions fréquentes

Substitutions invisibles qui provoquent des bugs subtils.

"--" vs —, - vs —, – vs —, − (signe moins) vs —

3 Espaces typographiques autour du tiret

En français, on emploie souvent des espaces fines insécables.

Espace fine insécable (U+202F)
NBSP (U+00A0) - Espace insécable
Thin Space (U+2009), Hair Space (U+200A)
Attention aux copier-coller qui ajoutent des espaces non voulus

4 Variantes Unicode du tiret

Plusieurs tirets existent et ne doivent pas être confondus.

Figure dash (U+2012) ‒
En dash (U+2013) –
Em dash (U+2014) —
Horizontal bar (U+2015) ―

Problèmes classiques

Copier-coller depuis le web ou Word

Remplace le trait d’union par un tiret long — et casse des URL, slugs, commandes CLI ou CSV.

Tests unitaires qui échouent

Une chaîne attend un trait d’union "-" mais reçoit "—" (U+2014), la comparaison échoue.

split() ou replace() inadapté

Découper sur "-" n’attrape pas "—", d’où des champs non séparés ou des slugs mal formés.

Regex fragile sur les tirets

[-] ne couvre pas —/–/‒/−. Il faut lister les variantes ou utiliser les propriétés Unicode.

Exemple de problème courant :

# Chaînes qui semblent identiques mais diffèrent par le tiret
string1 = "email-domain.com"
string2 = "email—domain.com" # Contient U+2014 (tiret long)
assert string1 == string2 # ❌ Échec

Symptômes qui doivent vous alerter

🚨 Signaux d'alarme

!
Un diff git montre un changement de « - » en « — » alors que visuellement c’est quasi identique
!
Des slugs ou URL deviennent invalides après un copier-coller depuis un éditeur riche
!
Une recherche "tiret-long" ne retrouve pas "tiret—long" dans votre application
!
Votre éditeur remplace automatiquement "-" par "—" (smart dashes) sans que vous le souhaitiez
!
Une commande collée dans un terminal échoue car un tiret d’option est typographié

Comment les détecter

Solution recommandée : Clean ASCII

Clean ASCII identifie immédiatement les tirets Unicode et vous indique où se trouvent les em dashes (—), les en dashes (–) et autres variantes proches, avec des propositions de normalisation adaptées au contexte.

✅ Détection automatique

— (U+2014), – (U+2013), ‒ (U+2012), − (U+2212) et plus

📊 Analyse complète

Codes Unicode, positions exactes, recommandations d’usage

🧹 Nettoyage automatique

Conversion vers "-" pour slugs/URL ou normalisation typographique FR

💾 Export propre

Texte corrigé prêt à intégrer dans vos contenus ou pipelines

Autres méthodes de détection

Affichage dans l'éditeur

Activez l’affichage des caractères non-ASCII et de la ponctuation invisible
Désactivez “smart dashes” qui convertit "-" en "—" dans vos éditeurs

En ligne de commande (Unix)

# Rechercher les tirets Unicode (U+2012–U+2015 et U+2212)
grep -P "[\x{2012}-\x{2015}\x{2212}]" fichier.txt
# Visualiser les caractères spéciaux en fin de ligne
sed -n l fichier.txt
# Afficher les caractères non imprimables/étendus
cat -A fichier.txt
# Inspecter les octets (— = e2 80 94)
hexdump -C fichier.txt

En code

JavaScript

str.replace(/[\u2012-\u2015\u2212]/g, "-")

Python

re.sub(r"[\u2012-\u2015\u2212]", "-", s)

Excel / Google Sheets

SUBSTITUTE(A1;"—";"-")

Nettoyer et prévenir

🚀 Solution rapide avec Clean ASCII

Avant de coder des remplacements complexes, utilisez Clean ASCII pour repérer et convertir instantanément les tirets longs et signes proches :

Détection des tirets Unicode
Nettoyage vers "-" ou normalisation FR
Export immédiat

Méthodes techniques avancées

🔧 Normaliser

Définissez une règle : pour slugs/URLs, convertir —/–/‒/− en "-"
Pour la typographie FR, appliquez des espaces fines insécables autour du tiret choisi
Stabilisez l’encodage (UTF‑8) et évitez les conversions automatiques d’éditeurs

🧹 Filtrer

Écrivez des fonctions normalize_dashes() qui unifient tous les tirets
Remplacez — par - dans les identifiants, noms de fichiers et chemins
Bloquez les caractères U+2012–U+2015 et U+2212 là où seul "-" est autorisé

⚙️ Automatiser

Hooks pre-commit qui refusent les tirets Unicode dans le code et configs
Tests sur la génération de slugs et la sanitation d’entrée utilisateur
Linting CI pour détecter —/–/‒/− hors zones autorisées

Checklist rapide

Politique claire d’usage des tirets (—/–/-) selon le contexte
Éditeur configuré (smart dashes désactivés, UTF‑8 stable)
Fonction utilitaire de normalisation des tirets dans vos libs
Tests garantissant des slugs/URLs sans tirets Unicode
CI qui détecte U+2012–U+2015 et U+2212 hors zones autorisées
Règles typographiques documentées (espaces fines autour du tiret)

Conclusion

Le tiret long est un atout typographique, mais sa confusion avec d’autres signes provoque des erreurs difficiles à repérer.

Adoptez une normalisation cohérente, détectez les tirets Unicode indésirables et vous éviterez la plupart des bugs liés aux chaînes et aux contenus.

Détectez les tirets longs mal utilisés maintenant

Utilisez notre outil pour identifier et corriger les tirets longs et signes proches dans vos textes.

Analyser mon texte