Por qué falla el código generado por IA, y cómo arreglar la causa real
Un linter marca error en una línea que se ve perfecta. Un JSON falla la validación en un campo que coincide exactamente con el esquema, misma longitud, mismos caracteres, todo igual. El fallo casi nunca está en tu lógica. Está entre dos letras, invisible, y llegó ahí porque copiaste el código desde una ventana de chat.
El texto copiado de una interfaz de chat de IA suele llevar caracteres Unicode invisibles, espacios de ancho cero, uniones, espacios de no separación, restos de cómo esa interfaz compone su respuesta como HTML con tipografía. No son una marca de agua y nadie los puso ahí a propósito. Tampoco se ven en un editor normal, por eso causan errores de sintaxis, longitudes de cadena corruptas y llamadas a la API que fallan sin explicación aparente. Pega el código en el comprobador de abajo y todos aparecen.
Más: qué se encontró, vista de rayos X y opciones
Vista de rayos X
Tu texto con cada carácter oculto expuesto como una etiqueta. Pasa el cursor para ver su nombre Unicode.
Qué se encontró
| Punto de código | Carácter | Cantidad | Acción |
|---|
Qué son realmente estos caracteres
Puntos de código Unicode estándar, ni malware ni una firma deliberada. Una unión de ancho cero fusiona dos emoji en un solo glifo. Una unión de palabras evita que un renderizador corte la línea justo ahí. Trabajos legítimos, todos, solo que no dentro de un nombre de variable o una cadena SQL.
| Carácter | Punto de código | Para qué sirve | Qué le hace al código |
|---|---|---|---|
| Espacio de ancho cero | U+200B | Marca un punto de salto de línea en texto denso | Divide identificadores, rompe coincidencias de regex \bpalabra\b |
| Unión de ancho cero | U+200D | Combina secuencias de emoji | Cambia la longitud de la cadena en silencio; .length miente |
| Unión de palabras | U+2060 | Evita un salto de línea no deseado | Corrompe tokens que luego se comparan o se hashean |
| Espacio de no separación | U+00A0 | Mantiene un número pegado a su unidad | Parece un espacio y no lo es; validadores de formularios y esquemas lo rechazan |
Nada de esto se ve en un editor normal. Ese es el problema entero: tu revisión de código, tu diff, tus propios ojos, nada lo detecta, porque no hay nada visible que detectar.
Dónde te muerde esto en la práctica
Un linter falla en una línea perfecta
Casi siempre un espacio de ancho cero metido dentro de un identificador, que para el parser divide un token en dos.
Una importación CSV o de base de datos corrompe una fila
Un carácter suelto convierte un campo numérico limpio en texto, o empuja un valor más allá de un límite de longitud que nadie fijó a propósito.
Una llamada a la API devuelve 400 sin causa visible
Los validadores JSON estrictos no perdonan puntos de código inesperados dentro de un string, y el cuerpo de la petición se ve completamente normal en cualquier herramienta con la que lo revises.
Es importante ser preciso aquí: una marca de agua estadística real, del tipo que Anthropic y Google empezaron a desplegar este año, funciona de forma completamente distinta. Esa señal vive en qué palabras eligió el modelo, no en ningún carácter que puedas seleccionar. Ver la marca de Claude y SynthID de Gemini. Lo que rompe tu código es un problema aparte, mucho más mundano, y a diferencia de una marca estadística, sí se puede arreglar del todo.
Preguntas frecuentes sobre caracteres ocultos en código de IA
¿Estos caracteres son una marca de agua de IA?
No. Ningún proveedor importante usa caracteres invisibles como marca de agua, se eliminarían con cualquier paso de limpieza de texto, lo que los haría inútiles para ese fin. Son residuos tipográficos de cómo compone su respuesta la interfaz de chat, no una señal deliberada.
¿La limpieza puede romper el formato de mi código?
No. Tabulaciones, saltos de línea e indentación se conservan exactamente igual. Solo se tocan los puntos de código invisibles sin significado visible, y los espacios inusuales se sustituyen por un espacio normal en vez de borrarse.
Más información
- La herramienta en español - pega código y compruébalo.
- Caracteres invisibles en el código - la clase de controles bidireccionales, más peligrosa todavía.
- El artículo completo (en inglés), con el detector en JavaScript y más ejemplos.