AI Watermark Check

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 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èrePoint de codeÀ quoi il sertCe qu’il casse dans le code
Espace de largeur nulleU+200BMarque un point de coupure dans un texte denseScinde les identifiants, casse les correspondances \bmot\b
Jointeur de largeur nulleU+200DFusionne des séquences d’emojisModifie silencieusement .length
Joint de motU+2060Empêche une coupure de ligneCorrompt les tokens comparés ou hachés
Espace insécableU+00A0Garde 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