De dónde vienen los caracteres invisibles
Ninguno se escribe a propósito. Una interfaz de chat muestra la respuesta del asistente como HTML, y el HTML trae espacios de no separación (U+00A0) alrededor de números y tras cierta puntuación, zero-width spaces (U+200B) donde una palabra larga podía partirse, y guiones blandos (U+00AD) donde podía dividirse con guion. Los renderizadores de Markdown añaden selectores de variante junto a los símbolos. Los procesadores de texto y los PDF añaden espacios tipográficos (fino, de pelo, de medio cuadratín, de cuadratín) y comillas curvas. Windows añade finales de línea CRLF y a veces una marca de orden de bytes (U+FEFF) al principio del archivo. Al copiar se selecciona todo eso, y el resultado pegado se ve idéntico mientras se comporta de forma distinta al comparar, buscar con grep, hashear y compilar.
Texto oculto y marcas de agua
Unicode tiene un bloque de caracteres tag (U+E0000–U+E007F), uno por cada carácter ASCII, que ninguna fuente muestra. Se pensaron para etiquetas de idioma y hoy solo son válidos dentro de unos pocos emoji de bandera. Como son invisibles pero sobreviven al copiar y pegar, se usan para esconder un segundo mensaje dentro de uno visible: una inyección de prompt en un documento que leerá un asistente de IA, una huella que revela a quién se entregó el texto, o una forma de colar instrucciones ante un filtro. El mismo truco es posible con secuencias de caracteres zero-width (cada uno un bit) y con selectores de variante (hay 256, uno por byte). El limpiador elimina los tres y, para los caracteres tag, muestra el texto oculto decodificado.
Lo que no puede eliminar es una marca de agua estadística, en la que el patrón está en la elección de palabras y no en ningún carácter. En ese caso no hay nada en el texto que eliminar.
Controles bidi
Los overrides y aislamientos de derecha a izquierda (U+202E, U+2066–2069) cambian el orden de visualización de lo que sigue. En código fuente es el ataque «Trojan Source» (CVE-2021-42574): un comentario que se muestra después de una condición pero se compila antes. Los compiladores y GitHub ya avisan; esta herramienta los elimina. El inspector Unicode muestra cada uno con su posición exacta si quieres ver en lugar de eliminar.
Por qué algunas opciones vienen desactivadas
- Las comillas y guiones tipográficos son caracteres reales que pertenecen a la prosa. Actívalo cuando el destino sea código, un archivo de configuración o una shell, donde
“no es"y–no es-. - Las letras dobles (
аcirílica poralatina) solo son sospechosas en texto por lo demás latino; en ese caso el limpiador las marca y deja en paz un párrafo en cirílico. Sustituirlas cambia letras, por eso es una decisión, no un valor por defecto. - Los caracteres de uso privado suelen ser iconos de fuentes de iconos. En otros sitios aparecen como cajas y son inofensivos.
- Los selectores de variante solo se eliminan tras letras y dígitos, donde no tienen función; tras emoji y símbolos determinan la representación y se conservan.
En la línea de comandos
perl -CSD -pe 's/[\x{200B}-\x{200D}\x{2060}\x{FEFF}\x{00AD}\x{E0000}-\x{E007F}]//g; s/\x{00A0}/ /g' in.txt
sed -i 's/\xC2\xA0/ /g; s/\xE2\x80\x8B//g' file.txt # NBSP y ZWSP como bytes UTF-8
grep -nP '[^\x00-\x7F]' file.txt # mostrar cada línea no ASCII
cat -A file.txt | head # ^M para CR, M-BM- para NBSP Preguntas
¿Elimina las marcas de agua de la IA?
Elimina cualquier marca a nivel de carácter: caracteres zero-width, caracteres tag, selectores de variante y espacios inusuales, que son las formas en que un texto puede marcarse de manera invisible. Una marca de agua codificada en la propia elección de palabras no está hecha de caracteres y ningún limpiador puede eliminarla.
¿Por qué el texto de ChatGPT o Claude contiene caracteres ocultos?
Sobre todo como efecto secundario de la presentación: la respuesta se muestra como HTML, y al copiar HTML vienen espacios de no separación, zero-width spaces en los puntos de salto y puntuación tipográfica. Algunas herramientas y algunos documentos insertan a propósito caracteres tag o secuencias zero-width. La lista de hallazgos te dice qué tienes.
¿Rompe los emoji?
No. El zero-width joiner que mantiene unidas las secuencias de emoji (👨👩👧) se conserva cuando está entre dos emoji; los selectores de variante tras emoji y en keycaps se quedan, igual que los caracteres tag que forman las banderas regionales. Solo se eliminan los joiners entre letras normales.
¿Se sube el texto a algún sitio?
No. La página se ejecuta por completo en tu navegador; nada se envía a un servidor. Pega lo que quieras.
¿Cuál es la diferencia con el inspector Unicode?
El inspector lista cada carácter con su punto de código, bytes y nombre. El limpiador agrupa los problemas, los explica y produce el texto limpio. Usa el inspector para investigar y el limpiador para arreglar.