Pourquoi le code généré par IA plante, et comment réparer la vraie cause
Une erreur de linter sur une ligne qui semble pourtant correcte. Un appel API qui échoue sans raison visible. Le bug n’est presque jamais dans la logique : il se cache entre deux lettres, invisible, et il est arrivé là parce que le code a été copié depuis une fenêtre de chat.
Un texte copié depuis une interface de chat IA transporte souvent des caractères Unicode invisibles, espaces de largeur nulle, jointeurs, espaces insécables, restes de la façon dont l’interface met en forme sa réponse en HTML typographié. Ce n’est pas un filigrane et personne ne les a placés là exprès. Ils sont aussi totalement invisibles dans un éditeur normal, ce qui explique des erreurs de syntaxe, des longueurs de chaîne corrompues et des appels API qui échouent sans cause apparente. Collez le code dans le vérificateur ci-dessous : chacun d’eux apparaît.
Plus : éléments trouvés, vue rayons X et options
Vue rayons X
Votre texte avec chaque caractère caché exposé sous forme d’étiquette. Survolez pour voir son nom Unicode.
Ce qui a été trouvé
| Point de code | Caractère | Nombre | Action |
|---|
Ce que sont vraiment ces caractères
De vrais points de code Unicode standard, pas un logiciel malveillant, pas une signature délibérée. Un jointeur de largeur nulle fusionne deux emojis en un seul glyphe. Un espace insécable colle un chiffre à son unité. Un joint de mot empêche une coupure de ligne. Des usages légitimes, tous, mais qui n’ont rien à faire dans un nom de variable ou une chaîne SQL.
| Caractère | Point de code | À quoi il sert | Ce qu’il casse dans le code |
|---|---|---|---|
| Espace de largeur nulle | U+200B | Marque un point de coupure dans un texte dense | Scinde les identifiants, casse les correspondances \bmot\b |
| Jointeur de largeur nulle | U+200D | Fusionne des séquences d’emojis | Modifie silencieusement .length |
| Joint de mot | U+2060 | Empêche une coupure de ligne | Corrompt les tokens comparés ou hachés |
| Espace insécable | U+00A0 | Garde un chiffre collé à son unité | Ressemble à une espace, n’en est pas une ; rejetée par les validateurs |
Où ça mord vraiment
Un linter échoue sur une ligne parfaite
Souvent une espace de largeur nulle glissée dans un identifiant, qui scinde un seul token en deux aux yeux du parseur.
Un import CSV ou base de données corrompt une ligne
Un caractère parasite transforme un champ numérique propre en texte, ou dépasse une contrainte de longueur que personne n’a fixée exprès.
Un appel API renvoie 400 sans cause visible
Les validateurs JSON stricts n’acceptent pas les points de code inattendus dans une chaîne, et le corps de la requête paraît pourtant normal partout où vous le vérifiez.
Ce n’est pas un filigrane. Un vrai filigrane statistique, comme ceux que Claude ou Gemini déploient désormais, tient au choix des mots du modèle, pas à un caractère qu’on pourrait sélectionner. C’est un problème distinct, sans rapport, que cet outil ne touche pas. Voir statistique contre caractère pour le détail (en anglais).
Questions fréquentes
Ces caractères sont-ils un filigrane IA ?
Non. Aucun fournisseur majeur n’utilise des caractères invisibles comme filigrane, ce serait trivialement supprimé par n’importe quel nettoyage de texte. Ce sont des résidus typographiques laissés par l’interface de chat, pas un signal délibéré.
Le nettoyage va-t-il abîmer la mise en forme de mon code ?
Non. Tabulations, sauts de ligne et indentation sont préservés à l’identique. Seuls les points de code invisibles sans signification visible sont touchés, et les espaces inhabituelles sont remplacées par une espace normale plutôt que supprimées.
Pour aller plus loin
- L’outil principal en français.
- L’article complet (en anglais), avec exemples de détection en JavaScript.