Caracteres en blanco e invisibles
No hay un único carácter invisible, y la diferencia entre ellos es la diferencia entre un nombre que funciona y un archivo que no se deja analizar. Abajo están los ocho, con para qué sirve cada uno y qué rompe cada uno. Pulse copiar para llevarse uno: no parecerá que haya pasado nada, que es justo la idea.
Patrón braille en blanco U+2800
en blanco, del ancho de un carácter
Sirve para: La opción segura por defecto para un nombre o un mensaje que deba parecer vacío. Es una celda braille sin ningún punto levantado, o sea un carácter imprimible de verdad y no un espacio, y el código que recorta los blancos lo deja en paz.
Lo que rompe: Las tipografías sin cobertura braille dibujan un recuadro. No es un espacio, así que ni se contrae ni parte la línea como uno.
Relleno hangul U+3164
en blanco, del ancho de un carácter
Sirve para: El otro blanco aceptado casi en todas partes. Es el relleno de jamo coreano, invisible en casi cualquier tipografía, y el que suele funcionar allí donde una plataforma rechaza U+2800.
Lo que rompe: Algunas plataformas normalizan el hangul y lo quitan. Pruébelo antes de confiar en él.
Espacio de ancho cero U+200B
de ancho cero
Sirve para: Una oportunidad de corte de línea sin ancho. Su uso de verdad es decirle a quien presenta el texto por dónde puede partirse una cadena larga y sin cortes, como una URL.
Lo que rompe: Es un límite de palabra, así que rompe en silencio el Ctrl+F, el copiar y pegar y la comparación de cadenas. Un texto que parece idéntico deja de coincidir. No lo use como carácter en blanco.
Unidor de palabras U+2060
de ancho cero
Sirve para: Lo contrario del espacio de ancho cero: prohíbe el corte en ese punto sin añadir ancho. Este es el carácter correcto para pegar dos cosas.
Lo que rompe: Invisible para el lector e invisible en un diff, lo que lo convierte en un incordio a la hora de depurar.
Espacio duro de ancho cero U+FEFF
de ancho cero
Sirve para: Solo es correcto como primerísimo carácter de un archivo, donde es la marca de orden de bytes que declara la codificación.
Lo que rompe: En cualquier otro sitio es un fallo. Al principio de un CSV estropea el nombre de la primera columna; dentro de un JSON hace que el analizador falle en la línea 1. Unicode desaconsejó su uso como unidor y U+2060 lo sustituyó.
Espacio duro U+00A0
del ancho de un espacio
Sirve para: Un espacio que no parte la línea. Es lo correcto entre un número y su unidad, o en un nombre que deba quedarse en un solo renglón.
Lo que rompe: Se ve: ocupa el ancho de un espacio. No es un carácter en blanco, y pegarlo dentro de código donde se espera un espacio corriente es un error de sintaxis silencioso de manual.
Espacio de cifra U+2007
del ancho de una cifra
Sirve para: Relleno que alinea columnas de números, porque mide exactamente lo que una cifra en esa misma tipografía.
Lo que rompe: En casi todos los tipos es más ancho que un espacio normal, así que en prosa queda mal.
Unidor de ancho cero U+200D
de ancho cero
Sirve para: El carácter que construye los emojis compuestos: una familia o un oficio son varios emojis unidos con este en medio.
Lo que rompe: Por su cuenta no hace nada visible y puede que se lo quiten. No es un carácter en blanco y no debería usarse como tal.
Cuál quiere usted de verdad
Un nombre de usuario que parezca vacío, o un mensaje que aparezca en blanco. Use U+2800, y U+3164 donde lo rechacen. Los dos son caracteres imprimibles corrientes, así que una plataforma que recorte los espacios no los quitará. Un carácter de ancho cero es aquí la elección equivocada: muchas plataformas tratan como vacío un nombre hecho solo de caracteres de ancho cero y lo rechazan.
Un sitio por donde pueda partirse una línea larga. U+200B, asumiendo que estropea la búsqueda dentro del texto.
Dos cosas que no deben separarse. U+2060 si no quiere añadir ancho, o U+00A0 donde de todos modos quiere un espacio.
Nada. Si un campo acepta un espacio corriente, use uno. Un carácter invisible es un apaño para sortear un validador, y viaja hasta todos los sistemas que lean después ese campo.
Por qué estos rompen cosas en silencio
Ninguno de estos caracteres se ve, así que ninguno se ve tampoco dentro de un fallo. Un espacio de ancho cero pegado en un campo de contraseña es una contraseña equivocada sin ningún carácter equivocado en pantalla. Una marca de orden de bytes en lo alto de un CSV renombra la primera columna a algo que ya no coincide con su código. Dos cadenas que se ven idénticas dejan de compararse iguales, y por mucho que las mire nada se lo explica.
La manera de verlos es dejar de fiarse de los ojos: pegue el texto en un visor hexadecimal, o páselo por un volcado de puntos de código. Cada carácter de este sitio lleva su punto de código impreso al lado por ese motivo, y la API de caracteres devuelve el punto de código de cualquier cosa que pueda pegar en ella.