Pourquoi les guillemets courbes cassent votre code, JSON et CSV

L’erreur pointe vers une ligne qui semble parfaitement correcte, car la différence est invisible au premier coup d’œil.

Les guillemets courbes (« “ ” ‘ ’ ») sont des caractères Unicode différents des guillemets droits (" ') exigés par les langages de programmation et les formats de données. Les parseurs comparent des points de code exacts : un guillemet courbe n’est donc pour eux qu’un caractère ordinaire, et la chaîne ne s’ouvre jamais. Les remplacer par des guillemets droits règle le problème immédiatement.

Ce sont réellement des caractères différents

Tout le problème tient dans ce tableau :

Caractère Nom Point de code
" Guillemet droit double U+0022
Guillemet double ouvrant U+201C
Guillemet double fermant U+201D
' Apostrophe droite U+0027
Guillemet simple ouvrant U+2018
Guillemet simple fermant U+2019

Les langages de programmation, JSON, CSV et les interpréteurs de shell ne reconnaissent que deux de ces caractères comme délimiteurs de chaînes : U+0022 et U+0027. Les quatre autres sont des caractères imprimables ordinaires, au même titre qu’une lettre ou une virgule.

Quand un parseur rencontre “name”, il ne voit donc pas une chaîne entre guillemets légèrement décoratifs. Il voit une séquence de caractères non délimitée commençant par un symbole inattendu. Le message d’erreur indique quelque chose comme unexpected token et pointe vers une ligne qui semble parfaitement correcte, car à taille de police normale, la différence entre " et “ tient à quelques pixels de courbure.

COLLÉ DEPUIS LE CHAT{ name: Ada }SyntaxError: Unexpected token '“'APRÈS NORMALISATION{ "name": "Ada" }
Les guillemets courbes sont des caractères différents des guillemets droits attendus par les analyseurs.

D’où viennent-ils

Presque toujours d’un logiciel qui essaie de vous aider.

  • Word et Google Docs convertissent les guillemets droits en guillemets courbes pendant la saisie. L’option est activée par défaut et la plupart des gens ne la remarquent jamais, car dans un texte courant, c’est exactement ce qu’il faut.
  • Les modèles de conversation en produisent parce qu’ils ont appris à partir de textes publiés, composés avec de vrais guillemets typographiques.
  • macOS applique la substitution intelligente au niveau du système dans de nombreux champs de texte.
  • Les éditeurs de CMS et les zones de commentaires appliquent fréquemment des filtres typographiques au texte soumis.
  • Le copier-coller depuis un PDF transporte ce que le typographe a utilisé, et dans tout document produit professionnellement, ce sont des guillemets courbes.

Le point commun : le texte est passé par un outil conçu pour la lecture avant d’arriver à un outil conçu pour l’analyse syntaxique. La prose veut des guillemets typographiques ; le code veut des octets exacts. Les problèmes surviennent à la frontière.

La même chose s’applique à quelques compagnons utiles à connaître : le caractère points de suspension (…) au lieu de trois points, les tirets demi-cadratin et cadratin au lieu du trait d’union, et les espaces insécables au lieu des espaces ordinaires. Chacun est un point de code différent du caractère ASCII auquel il ressemble, et chacun casse un parseur de la même manière silencieuse.

Ce qui casse, concrètement

JSON. Chaque chaîne JSON doit utiliser U+0022. Un seul guillemet courbe rend le document invalide, et comme les parseurs signalent la première erreur rencontrée, un fichier qui en contient des dizaines demande plusieurs allers-retours pour être corrigé à la main. Le coller dans un formateur et validateur JSON montre la position exacte du premier fautif.

CSV. Les règles de guillemets existent pour protéger les champs contenant des virgules. Un guillemet courbe n’est pas un caractère de citation, donc un champ comme “Smith, John” est coupé à la virgule et toutes les colonnes suivantes se décalent d’une position. C’est pire qu’une erreur de syntaxe, car l’échec est silencieux : vous obtenez un fichier qui s’importe sans protester et qui est faux.

Code source. Dans la plupart des langages, c’est une erreur de compilation ou d’analyse, ce qui a au moins le mérite d’être bruyant. Dans les scripts shell, cela peut être pire : rm –rf avec un tiret demi-cadratin au lieu d’un trait d’union n’est pas l’option voulue, et les arguments entre guillemets courbes sont transmis tels quels comme texte littéral.

Fichiers de configuration. YAML, TOML et les fichiers .env acceptent silencieusement les guillemets courbes comme partie de la valeur. Votre clé d’API se retrouve affublée d’un caractère décoratif, l’authentification échoue, et rien dans les journaux ne vous dit pourquoi.

Expressions régulières et recherche. Un motif contenant un guillemet droit ne correspondra pas à un texte contenant un guillemet courbe : le rechercher-remplacer retourne silencieusement zéro résultat.

Comment corriger proprement

Normalisez le texte. Collez-le dans Convertir les guillemets courbes en guillemets droits, qui remplace les quatre variantes courbes par leurs équivalents ASCII et indique combien ont été modifiées. Pour les textes issus d’une IA en particulier, le nettoyeur de textes IA traite les guillemets en même temps que les tirets cadratins, les caractères invisibles et les emojis en un seul passage.

Désactivez la source. Si le problème revient souvent, coupez la substitution :

  • Word : Fichier → Options → Vérification → Options de correction automatique → Lors de la frappe → décochez « Guillemets droits par des guillemets typographiques ».
  • Google Docs : Outils → Préférences → décochez « Utiliser les guillemets typographiques ».
  • macOS : Réglages Système → Clavier → Saisie de texte → Modifier → désactivez les guillemets et tirets intelligents.

Ne rédigez pas de code dans un traitement de texte. La vraie solution est structurelle. Tout ce qui est destiné à un parseur doit être écrit dans un éditeur de texte brut, qui ne réécrira jamais vos caractères.

Attention à la surcorrection. Ne remplacez pas systématiquement les guillemets courbes dans la prose. Dans un article ou un e-mail, les guillemets typographiques sont corrects et les guillemets droits font moins bien. Normalisez à la frontière — quand le texte passe d’un document vers du code ou des données — pas partout par défaut.

Si un fichier échoue encore après la normalisation des guillemets, le suspect suivant est un caractère invisible ; consultez la référence sur les caractères Unicode invisibles.

Questions fréquentes

Pourquoi mon JSON affiche-t-il unexpected token alors qu’il semble correct ?

C’est presque toujours un guillemet courbe à la place d’un guillemet droit. JSON exige U+0022 exactement, et les variantes courbes U+201C et U+201D sont des caractères ordinaires pour un parseur. La différence ne tient qu’à quelques pixels à l’écran, ce qui explique que la ligne semble correcte.

Quelle est la différence entre guillemets courbes et guillemets droits ?

Ce sont des caractères Unicode différents. Les guillemets droits sont U+0022 et U+0027, les caractères ASCII attendus par tous les parseurs. Les guillemets courbes sont U+2018, U+2019, U+201C et U+201D — des marques typographiques qui se courbent vers le texte, correctes dans la prose et invalides comme délimiteurs de chaînes.

Comment convertir les guillemets courbes en guillemets droits ?

Collez le texte dans un outil de normalisation comme Convertir les guillemets courbes en guillemets droits, qui remplace les quatre variantes courbes et affiche le compte. Le faire avec un rechercher-remplacer demande quatre passages séparés, un par caractère, ce qui explique pourquoi c’est souvent fait de manière incomplète.

Pourquoi mon import CSV décale-t-il les colonnes ?

Un champ contenant une virgule n’est protégé que s’il est entouré de guillemets droits. Les guillemets courbes ne sont pas des caractères de citation : le champ est donc coupé à la virgule et chaque colonne suivante se décale. Cet échec est silencieux et produit un fichier qui s’importe proprement tout en étant faux.

Faut-il toujours supprimer les guillemets courbes ?

Non. Dans la prose, ils constituent une typographie correcte et sont plus élégants que les guillemets droits. Ne normalisez que lorsque le texte bascule vers du code, du JSON, du CSV, des fichiers de configuration ou tout autre contenu destiné à être analysé plutôt que lu.

Outils mentionnés dans ce guide

Guides associés