Los caracteres invisibles escondidos en tu texto de IA
Copias un párrafo de una ventana de chat, lo pegas en tu gestor de contenidos y el texto parece idéntico. Byte a byte, normalmente no lo es.
Caracteres sin anchura
Unicode contiene un conjunto de puntos de código que no ocupan espacio y no
dibujan nada. Existen por razones tipográficas legítimas. U+200B ZERO WIDTH SPACE indica un lugar donde una palabra larga puede partirse al final de línea.
U+200D ZERO WIDTH JOINER une emojis, y así se construye el emoji de familia a
partir de varias personas. U+FEFF nació como marca de orden de bytes.
Como no dibujan nada, también sobreviven a casi cualquier copiar y pegar sin que nadie se dé cuenta. Eso los convierte en un canal cómodo para todo aquello que quieras que viaje con un texto sin que se vea en él.
El bloque Tags
El rango más interesante va de U+E0000 a U+E007F, el bloque Unicode Tags. Cada
punto de código refleja un carácter ASCII imprimible: U+E0041 corresponde a A,
U+E0061 a a, y así sucesivamente.
Conviene decir la consecuencia despacio: cualquier cadena ASCII puede recodificarse como caracteres Tags, añadirse a una frase visible y volverse completamente invisible sin dejar de ser perfectamente recuperable. Un identificador de sesión, un nombre de cuenta, una marca temporal. El texto parece limpio y lleva una huella.
Controles bidireccionales
Un tercer grupo no ocupa espacio, sino que cambia el orden de lectura:
U+202E RIGHT-TO-LEFT OVERRIDE y sus parientes. En prosa suelen ser restos
inocuos de un documento con varias escrituras. En un nombre de archivo o un
identificador pueden hacer que el texto se muestre en un orden distinto al que se
almacena, que es la base de una conocida familia de trucos de suplantación.
Cómo verlos
No se puede arreglar lo que no se ve, y ningún editor normal te los mostrará. Tres opciones prácticas:
- Buscar el punto de código directamente. La mayoría de editores aceptan
\x{200B}o algo similar en una búsqueda con expresiones regulares. - Pasar el texto por algo que imprima puntos de código en lugar de glifos.
- Pegarlo en una herramienta hecha para eso, como el limpiador de nuestra portada, que enumera por nombre cada punto de código encontrado y te muestra en qué lugar del texto estaba.
Qué eliminar y qué conservar
No todo carácter invisible es basura, y un limpiador que los borre todos se equivoca de una forma que el usuario nota.
U+FE0F VARIATION SELECTOR-16 es la diferencia entre un corazón rojo y uno
monocromo. Un joiner entre dos pictogramas está manteniendo un emoji unido. Si los
eliminas, has roto contenido visible en nombre de la limpieza.
Por eso la regla de nuestro motor es más estrecha que “quitar los invisibles”. Elimina todo el bloque Tags sin condiciones, elimina los caracteres de ancho cero y de formato en la prosa, y deja en paz un joiner cuando hay un pictograma a cada lado. Todo lo demás lo informa en lugar de borrarlo.