Por que o código gerado por IA quebra, e como corrigir a causa real
Um linter aponta erro numa linha que parece perfeita. Uma chamada de API retorna 400 num payload que bate exatamente com o schema. O bug quase nunca está na sua lógica: está entre duas letras, invisível, e chegou ali porque você colou o código de uma janela de chat.
Texto copiado de uma interface de chat de IA costuma carregar caracteres Unicode invisíveis, espaços de largura zero, junções, espaços sem quebra, resíduos de como a interface renderiza a resposta como HTML tipografado. Não são marca d’água e ninguém os colocou ali de propósito. Também são completamente invisíveis num editor comum, por isso causam erros de sintaxe, tamanhos de string corrompidos e chamadas de API que parecem impossíveis de explicar. Cole o código no verificador abaixo e cada um deles aparece.
Mais: o que foi encontrado, visão de raio-X e opções
Visão de raio-X
Seu texto com cada caractere oculto exposto como uma etiqueta. Passe o mouse para ver o nome Unicode.
O que foi encontrado
| Ponto de código | Caractere | Quantidade | Ação |
|---|
O que esses caracteres realmente são
Pontos de código Unicode legítimos, não malware e não uma assinatura deliberada. Cada um tem um trabalho real, só que não dentro de um nome de variável ou de uma string SQL.
| Caractere | Ponto de código | O que quebra no código |
|---|---|---|
| Espaço de largura zero | U+200B | Divide identificadores, quebra casamentos de regex |
| Junção de largura zero | U+200D | Muda o tamanho da string sem avisar; .length mente |
| Junção de palavras | U+2060 | Corrompe tokens usados em diff ou hash |
| Espaço sem quebra | U+00A0 | Parece espaço, não é; validadores de formulário e schema rejeitam |
Nada disso aparece num editor comum. Esse é o problema inteiro: sua revisão de código, seu diff, seus próprios olhos, nada detecta, porque não há nada visível para detectar.
Onde isso realmente morde
Um linter falha numa linha perfeita
Geralmente um espaço de largura zero encravado num identificador, dividindo um token em dois para o parser.
Uma importação de CSV ou banco corrompe uma linha
Um caractere perdido transforma um campo numérico limpo em texto, ou empurra um valor além de um limite de tamanho que ninguém definiu de propósito.
Uma chamada de API retorna 400 sem causa visível
Validadores de JSON rigorosos não perdoam pontos de código inesperados dentro de uma string, e o corpo da requisição parece completamente normal em qualquer ferramenta que você usar para checar.
Vale ser preciso aqui: uma marca d’água estatística de verdade, do tipo que Anthropic e Google já usam em alguns modelos, funciona de um jeito totalmente diferente. Esse sinal vive nas palavras que o modelo escolheu, não em nenhum caractere que dá para selecionar. O que quebra seu código é um problema separado, bem mais mundano, e ao contrário de uma marca estatística, totalmente corrigível.
Perguntas sobre caracteres ocultos em código de IA
Esses caracteres são uma marca d’água de IA?
Não. Nenhum fornecedor importante usa caracteres invisíveis como marca d’água, seria removido por qualquer limpeza de texto, o que tornaria a técnica inútil. São resíduos tipográficos de como uma interface de chat renderiza a resposta, não um sinal deliberado.
Limpar isso muda a formatação do meu código?
Não. Tabs, quebras de linha e indentação são preservados exatamente. Só pontos de código invisíveis sem significado visual são tocados, e espaços incomuns viram um espaço comum em vez de serem apagados.
Saiba mais
- A ferramenta em português.
- Caracteres invisíveis em código - a classe de controles bidirecionais, mais séria.
- O artigo completo (em inglês), com exemplo de detecção em JavaScript.