Intermédiaire 8 min de lecture 25 janvier 2025

Curly quotes : guillemets typographiques, pièges et solutions

Les “curly quotes” embellissent un texte, mais elles sabotent vite du code, du JSON, un .env ou une commande shell. Elles ressemblent à des guillemets classiques, pourtant elles n'ont pas la même valeur. Voici comment les reconnaître, éviter les erreurs et standardiser vos contenus.

Curly quotes : c'est quoi exactement ?

Ce sont des guillemets et apostrophes typographiques courbes, différents des guillemets droits ASCII. Visuellement proches, ils ont des codes Unicode distincts et peuvent casser des parsers stricts.

Les familles de caractères à connaître pour éviter la confusion :

1 Guillemets droits ASCII

Ceux attendus par la plupart des langages, formats et shells.

' (39), " (34), ` (96)

2 Apostrophes et guillemets typographiques Unicode

Souvent insérés par Word, Pages, messageries ou CMS.

‘ (U+2018), ’ (U+2019), “ (U+201C), ” (U+201D)

3 Guillemets français et ponctuation associée

Utilisés en typographie française, attention aux espaces autour.

« (U+00AB), » (U+00BB)
Souvent accompagnés d’espaces insécables fines
Peuvent perturber JSON, YAML, CSV, CLI

4 Caractères trompe-l'œil proches des quotes

Ressemblent à des quotes mais n’en sont pas.

Modifier Letter Apostrophe ʼ (U+02BC)
Prime ′ (U+2032), Double Prime ″ (U+2033)
Fullwidth " (U+FF02), ' (U+FF07)

Problèmes classiques

Copier-coller depuis le web ou Word

Injecte des “ ” ou ’ dans du code/JSON et provoque des erreurs de syntaxe.

Tests unitaires qui échouent

Comparaison de chaînes impossible: "abc" ≠ “abc”. Les hachages et signatures divergent.

Chaînes de config ou code invalides

YAML, TOML, .env, SQL et CLI ne reconnaissent pas “ ” et ’ comme quotes valides.

Regex ou remplacements incomplets

Un pattern comme ["'] n’attrape pas “ ” ‘ ’, entraînant des traitements partiels.

Exemple de problème courant :

# Deux chaînes visuellement identiques mais différentes
string1 = "hello"
string2 = “hello” # Utilise U+201C et U+201D
assert string1 == string2 # ❌ Échec

Symptômes qui doivent vous alerter

🚨 Signaux d'alarme

!
Un diff git remplace des " par “ ” sans changement visible à l’œil nu
!
Une commande copiée-colée dans un terminal échoue avec “command not found”
!
JSON invalide: Unexpected token “ ou ’ à l’analyse
!
Votre éditeur remplace automatiquement ' et " par des variantes typographiques
!
Des signatures ou checksums changent sans modification fonctionnelle

Comment les détecter

Solution recommandée : Clean ASCII

Clean ASCII identifie immédiatement les curly quotes et toutes les variantes de guillemets non ASCII. L’analyse montre les positions, les codes Unicode et propose un remplacement sûr en guillemets droits.

✅ Détection automatique

“ ” ‘ ’ « » ′ ″ ʼ et versions fullwidth

📊 Analyse complète

Codes Unicode, positions exactes, aperçu des remplacements

🧹 Nettoyage automatique

Conversion vers ' et " sécurisés pour vos parsers

💾 Export propre

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

Autres méthodes de détection

Affichage dans l'éditeur

Activez l’affichage des caractères non-ASCII et des glyphes typographiques
Désactivez “Smart Quotes” dans macOS, iOS, Word, Google Docs, JetBrains, VS Code

En ligne de commande (Unix)

# Rechercher les guillemets typographiques et assimilés
grep -P "[\x{2018}\x{2019}\x{201A}\x{201B}\x{201C}\x{201D}\x{201E}\x{201F}\x{00AB}\x{00BB}\x{2032}\x{2033}\x{02BC}\x{FF02}\x{FF07}]" fichier.txt
# Lister les octets et repérer les caractères hors ASCII
hexdump -C fichier.txt | less
# Afficher les caractères non imprimables ou spéciaux
cat -A fichier.txt
# Compter les occurrences par code point
perl -C -ne 'print join q(), map {sprintf "%04X\n", ord} /./g' fichier.txt | sort | uniq -c

En code

JavaScript

const map = { "“":"\"", "”":"\"", "‘":"'", "’":"'", "«":"\"", "»":"\"", "ʼ":"'", "′":"'", "″":"\"" };
const normalizeQuotes = s => s.replace(/[\u2018\u2019\u201C\u201D\u00AB\u00BB\u02BC\u2032\u2033]/g, c => map[c] || c);

Python

MAP = {"\u201C":'"', "\u201D":'"', "\u2018":"'", "\u2019":"'", "\u00AB":'"', "\u00BB":'"', "\u02BC":"'", "\u2032":"'", "\u2033":'"'}
def normalize_quotes(s):
    return ''.join(MAP.get(c, c) for c in s)

Excel / Google Sheets

SUBSTITUE(SUBSTITUE(SUBSTITUE(texte;"“";"""");"”";"""");"’";"'")

Nettoyer et prévenir

🚀 Solution rapide avec Clean ASCII

Avant de bricoler des regex, utilisez Clean ASCII pour traquer et convertir les curly quotes en guillemets droits compatibles.

Détection ciblée des “ ” ‘ ’ « »
Remplacement sûr et configurable
Export immédiat prêt à parser

Méthodes techniques avancées

🔧 Normaliser

Appliquez NFC/NFKC mais prévoyez une table de substitution: la normalisation ne remplace pas “ ” ‘ ’ par " et '
Décidez d’une convention de guillemets (simple ou double) et appliquez-la automatiquement
Uniformisez les apostrophes dans les contenus éditoriaux et les données

🧹 Filtrer

Écrivez une fonction normalize_quotes() mappant “ ” ‘ ’ « » → " et '
Remplacez ʼ, ′, ″ et les fullwidth par leurs équivalents ASCII
Validez l’absence de quotes typographiques à l’entrée (API, formulaires, imports)

⚙️ Automatiser

Hook pre-commit: rejet si présence de [\u2018-\u201F\u00AB\u00BB\u02BC\u2032\u2033\uFF02\uFF07]
Formatteurs (Prettier, Black, gofmt) et ESLint/Stylelint configurés pour des quotes droites
CI: linter textuel sur la doc, les gabarits, les migrations et les seeds

Checklist rapide

Linters/formatteurs imposant ' ou "
Pre-commit qui refuse “ ” ‘ ’ « » et assimilés
Paramétrage éditeurs/OS: Smart Quotes désactivés
Fonction de normalisation des quotes dans vos libs/utilitaires
Tests vérifiant l’absence de quotes typographiques indésirables
Documentation équipe: règles de citation et encodage uniformes

Conclusion

Les curly quotes sont esthétiques mais redoutables pour les parseurs. Les identifier et les remplacer évite des heures de diagnostic.

Détectez-les systématiquement, appliquez une normalisation cohérente et vos configurations, scripts et contenus resteront fiables.

Détectez les curly quotes maintenant

Utilisez notre outil pour repérer et convertir les guillemets typographiques dans vos textes.

Analyser mon texte