DEV Community

Por qué el texto invisible funciona en el nombre de TikTok y falla en el usuario de Instagram

Cada tanto vuelve la misma pregunta con otro disfraz: cómo poner el nombre invisible en TikTok, cómo mandar un mensaje vacío en WhatsApp. En 2026 la de moda es la de TikTok, y casi ningún video explica el mecanismo. Va aquí, desde el código.

Un espacio no es un carácter: para la app es un separador

Cuando escribes un nombre o un mensaje, la app lo recorta antes de guardarlo: trim() quita los espacios de los extremos, las secuencias se colapsan y un campo con solo espacios queda vacío. Después corre la validación: nombre vacío, rechazado.

Por eso el texto invisible no puede estar hecho de espacios, sino de caracteres que se dibujan como nada, pero que para el código de recorte no son espacio en blanco. Unicode tiene varios, ninguno diseñado para esto, y cada app los trata distinto.

Los cinco que importan

Carácter Code point Para qué existe Quién lo conserva
Hangul Filler U+3164 Relleno de sílabas coreanas: una "letra" que no dibuja nada Nombre y bio de TikTok e Instagram; nick de Free Fire y PUBG Mobile
Braille Pattern Blank U+2800 La celda braille sin puntos: un glifo imprimible y vacío Mensajes de WhatsApp, Telegram y Discord; comentarios de Instagram
Zero-Width Space U+200B Punto de corte de línea sin ancho X, Notas de iPhone, HTML; la mayoría de los chats lo elimina
Invisible Separator U+2063 Límite invisible entre elementos Facebook y Messenger
Hair Space U+200A El espacio tipográfico más delgado Word, Google Docs, correo

Hangul Filler es una letra (categoría Lo): un validador que pregunta "¿tiene al menos una letra?" responde que sí. Braille Blank es un símbolo (So), imprimible, así que "el mensaje no puede estar vacío" pasa. Zero-Width Space es un carácter de formato (Cf), y los caracteres de formato son lo primero que borra un sanitizador; por eso falla en WhatsApp y funciona en un editor de texto.

El truco de TikTok, explicado en un párrafo

El "nombre invisible en TikTok 2026" funciona así: el nombre para mostrar de TikTok es un campo de texto libre que valida "no vacío", no "solo letras y números". Pegas un U+3164, el campo recibe una letra, trim() no la toca porque no es espacio en blanco, y el servidor guarda un nombre que el renderizador dibuja como nada. Lo único nuevo frente a los nicks de Free Fire es el video. El mismo carácter funciona en el nombre y en las líneas de la bio de Instagram, pero no en el nombre de usuario (@handle): ese campo acepta únicamente letras, dígitos, puntos y guiones bajos, y ahí no hay blanco que sobreviva.

Por qué un nombre invisible se rompe tras una actualización

Un juego que antes aceptaba U+3164 y ahora lo rechaza no "arregló los nombres invisibles": alguien agregó normalización Unicode o un filtro por categoría al validador, casi siempre para frenar suplantaciones con nombres idénticos a la vista. En cuanto corre NFKC, U+3164 se convierte en U+1160 (Hangul Jungseong Filler), y un filtro por categoría lo elimina del todo; U+FFA0 (la forma de medio ancho) se convierte en lo mismo. Roblox es el ejemplo típico: elimina la mayoría de los rellenos tras cada actualización. Y como en Free Fire cambiar de nombre cuesta 390 diamantes o una tarjeta, prueba en una cuenta secundaria antes de gastar.

Detectarlo es trivial

Invisible no significa oculto: cualquier cosa que cuente caracteres lo delata:

const INVISIBLES = new Set([0x200B, 0x200C, 0x200D, 0x2800, 0x3164, 0xFFA0, 0x2063, 0x200A]);

const reporte = (s) => {
  let invisibles = 0;
  for (const ch of s) if (INVISIBLES.has(ch.codePointAt(0))) invisibles++;
  return { total: [...s].length, invisibles, utf16: s.length };
};

reporte('anaㅤ⠀');   // { total: 5, invisibles: 2, utf16: 5 }
reporte('👨‍👩‍👧');    // { total: 5, invisibles: 2, utf16: 8 }
Enter fullscreen mode Exit fullscreen mode

Dos detalles que muerden. .length cuenta unidades UTF-16, no caracteres: un emoji fuera del BMP vale 2 y el de la familia vale 8 (tres personas unidas por dos U+200D, que también caen en la lista: segmenta en grafemas con Intl.Segmenter antes de filtrar). Itera siempre con for…of. Y normaliza después de contar: s.normalize('NFKC') convierte U+3164 y U+FFA0 en U+1160 (que no está en la lista) y el espacio fino en un espacio normal: el contador deja de verlos.

Dónde conseguir el carácter correcto

Un teclado no tiene tecla para U+3164; se copia de una página que lo tenga listo. La versión en español de texto invisible para copiar y pegar ofrece los cinco caracteres de la tabla con la app que conserva cada uno. La referencia en inglés, con entidades HTML, escapes CSS y una casilla que comprueba si lo que pegaste contiene un carácter invisible o solo espacios, está en la página de invisible text. Todo corre en el navegador: es un navigator.clipboard.writeText de una cadena que la página ya contiene.

Resumen práctico

  • Mensaje en blanco en WhatsApp, Telegram o Discord: U+2800. WhatsApp y Telegram eliminan U+200B.
  • Nombre en TikTok, Instagram, Free Fire o PUBG Mobile, o línea vacía de la bio en TikTok e Instagram: U+3164 (respaldo: U+FFA0).
  • Publicación en blanco en X o línea oculta en Notas de iPhone: U+200B; iMessage lo rechaza si va solo, ahí usa U+2800.
  • Facebook y Messenger: U+2063. Documentos y correo: U+200A.
  • Nada funciona en un campo que acepta solo [a-z0-9._]: el nombre de usuario de Instagram y el de Discord.

Si mantienes un campo de nombre y quieres frenar esto: normaliza con NFKC y rechaza lo que quede vacío tras quitar \p{Cf}, \p{Zs} y los dos rellenos Hangul. Y dilo en el mensaje de error, porque "nombre inválido" manda a la gente directo a las páginas de arriba.

Top comments (0)