Intermédiaire 8 min de lecture 25 janvier 2025

Hyphen minus (-) : comprendre les variantes et éviter les confusions

Un simple tiret peut casser une commande, invalider une signature HMAC ou faire échouer un import CSV. Le hyphen minus ASCII (-) ressemble à d'autres caractères Unicode. Voici comment les reconnaître, pourquoi cela casse des workflows et comment rester cohérent.

Qu'est-ce que le hyphen minus ?

C'est le caractère ASCII - (U+002D). Selon le contexte, on l'utilise comme tiret, signe moins, séparateur, ou indicateur d'option en CLI.

Les principales familles à connaître autour du hyphen minus :

1 Hyphen-minus ASCII et symboles proches

Le caractère standard attendu par la plupart des outils et protocoles.

Hyphen-minus '-' (45), Plus '+' (43), Underscore '_' (95), Equals '=' (61)

2 Tirets Unicode visuellement similaires

Ils ressemblent à -, mais ce ne sont pas les mêmes points de code.

Hyphen (U+2010), Non-breaking hyphen (U+2011), En dash (U+2013), Em dash (U+2014)

3 Signe moins et variantes mathématiques

Conçues pour les notations mathématiques, pas pour la ponctuation.

Minus sign (U+2212) - Signe moins mathématique
Figure dash (U+2012) - Aligné sur les chiffres
Minus fullwidth (U+FF0D), Small hyphen-minus (U+FE63)

4 Cas techniques et pièges

Césures conditionnelles et comportements de saut de ligne.

Soft Hyphen (U+00AD) - Césure conditionnelle
Non-breaking hyphen (U+2011) - Tiret insécable
Fullwidth forms (U+FF0D) - Variantes plein-chasse

Problèmes classiques

Copier-coller qui substitue '-' par '–' ou '−'

Word, Pages ou le web remplacent parfois le hyphen-minus par en dash (U+2013) ou minus (U+2212) dans des CSV, URLs ou paramètres.

Tests unitaires incohérents

La valeur attendue contient '-', mais la donnée réelle a '–' ou '−', ce qui invalide les comparaisons et les signatures.

Sanitisers incomplets

Des fonctions ne normalisent que U+002D et laissent passer les autres tirets Unicode.

Classes regex et ranges piégeux

Un range comme [A-Z-] n'attrape pas U+2013 ou U+2212, et un '-' mal échappé casse la classe.

Exemple de problème courant :

# Deux chaînes semblent identiques mais le tiret diffère
string1 = "content-type"
string2 = "content–type" # Contient U+2013 (en dash)
assert string1 == string2 # ❌ Échec

Symptômes qui doivent vous alerter

🚨 Signaux d'alarme

!
Un diff montre des changements de tirets alors que visuellement tout paraît identique
!
Des slugs/URLs avec '–' ou '−' renvoient 404 ou génèrent des doublons SEO
!
Une option CLI --long échoue après un copier-coller (en dash à la place de deux '-')
!
Des clés d'en-têtes HTTP (content-type) ne correspondent plus
!
Des calculs/signatures JSON ou CSV changent après “corrigez juste le tiret”

Comment les détecter

Solution recommandée : Clean ASCII

Clean ASCII met en évidence tous les tirets et signes moins non-ASCII. Il identifie précisément les points de code et propose une normalisation vers le hyphen minus quand c'est pertinent.

✅ Détection automatique

Hyphen (U+2010), NB hyphen (U+2011), en/em dashes, minus (U+2212)

📊 Analyse complète

Codes Unicode, positions exactes, contexte d'utilisation

🧹 Nettoyage automatique

Remplacement intelligent par '-' (U+002D) selon le cas

💾 Export propre

Contenu normalisé, prêt pour APIs, CSV, CLI

Autres méthodes de détection

Affichage dans l'éditeur

Activez “render whitespace/controls” et montrez les points de code
Installez un linter qui surligne en dash/em dash/signe moins

En ligne de commande (Unix)

# Rechercher les tirets/minus non-ASCII
grep -Pn "[\x{2010}-\x{2015}\x{2212}\x{FE63}\x{FF0D}]" fichier.txt
# Voir les caractères et fins de ligne
sed -n l fichier.txt
# Afficher les codes visibles
cat -A fichier.txt
# Inspecter les points de code
hexdump -C fichier.txt

En code

JavaScript

const normalized = str.replace(/[\u2010-\u2015\u2212\uFE63\uFF0D]/g, '-')

Python

re.sub(r'[\u2010-\u2015\u2212\uFE63\uFF0D]', '-', s)

Excel / Google Sheets

SUBSTITUE(SUBSTITUE(cellule;"–";"-");"−";"-")

Nettoyer et prévenir

🚀 Solution rapide avec Clean ASCII

Avant d'écrire des scripts maison, utilisez Clean ASCII pour convertir les tirets et signes moins exotiques vers - quand c'est adapté.

Détection des tirets lookalikes
Nettoyage et normalisation
Export immédiat

Méthodes techniques avancées

🔧 Normaliser

Appliquez une normalisation Unicode (NFKC) puis remappez les tirets vers U+002D si nécessaire
Interdisez les variantes plein-chasse (U+FF0D) dans les inputs
Homogénéisez les slugs, clés HTTP et flags CLI vers '-'

🧹 Filtrer

Écrivez des fonctions normalize_hyphen() couvrant U+2010..U+2015, U+2212, U+FE63, U+FF0D
Remplacez le signe moins mathématique par '-' dans les identifiants/chemins
Bloquez les soft hyphens (U+00AD) hors contextes typographiques

⚙️ Automatiser

Hooks pre-commit qui refusent les tirets non U+002D dans code/JSON/YAML
Sanitisation des inputs utilisateurs et normalisation côté API
Linting dans la CI pour les tirets lookalikes

Checklist rapide

Règle de normalisation des tirets vers '-' (U+002D)
Contrôle des slugs/URLs pour éviter en dash et minus
Éditeur configuré pour afficher les caractères similaires
Fonction utilitaire normalize_hyphen() dans vos libs
Tests détectant les tirets non-ASCII dans les données critiques
Conventions d'équipe sur l'usage de '-' selon le contexte

Conclusion

Le hyphen minus paraît anodin, mais ses sosies Unicode peuvent provoquer des erreurs coûteuses et difficiles à diagnostiquer.

Adoptez une normalisation systématique des tirets, automatisez les contrôles et vos chaînes resteront fiables de l'UI jusqu'à la production.

Vérifiez vos tirets et signes moins maintenant

Utilisez notre outil pour identifier et normaliser les caractères proches du hyphen minus dans vos textes.

Analyser mon texte