Invertir texto significa una de cuatro operaciones distintas, y pedir la equivocada es la razón de que el resultado se vea roto. Puedes invertir los caracteres (hola se convierte en aloh), invertir el orden de las palabras (uno dos tres se convierte en tres dos uno), invertir el orden de las líneas, o invertir cada palabra en su sitio y dejar intacta la forma de la frase. La inversión de caracteres es la respuesta literal, y es la que sale mal: los acentos se despegan de sus letras, los emoji llegan como cuadros vacíos, y el motivo está en cómo se almacena el texto, no en la herramienta que usaste.
¿Cuál de las cuatro quieres?
Pasa cada modo por la línea Café 👩💻 never odd or even y la diferencia es obvia:
- Invertir caracteres — todo el texto en espejo, el último carácter primero. De paso da vuelta el orden de las palabras y el de las líneas, que normalmente no es lo que la persona quería.
- Invertir el orden de las palabras — even odd never 👩💻 Café. Las palabras salen del final al principio, cada una todavía bien escrita. Este es el modo para un juego de orden de palabras, o para comprobar que un ordenamiento hace lo que crees.
- Invertir el orden de las líneas — la última línea pasa a ser la primera y ninguna línea se toca. Útil para un log que imprime lo más nuevo al final, o para cualquier lista cronológica que quieras leer desde abajo.
- Invertir cada palabra — éfaC 👩💻 reven ddo ro neve. La estructura de la frase intacta, cada palabra al revés en su lugar.
Si no sabes cuál necesitas, mira los cuatro. Son botones separados en el inversor de texto de este sitio, así que el mismo texto cambia de modo sin volver a escribirlo, y cuenta los caracteres como los cuenta un lector y no como los guarda el navegador — que es donde empieza la dificultad.
Por qué la versión de una línea falla
Busca cómo invertir un string y la respuesta siempre es s.split('').reverse().join(''). Es correcta para el inglés sin acentos y equivocada para casi todo lo demás, porque JavaScript guarda el texto como code units UTF-16: casillas fijas de 16 bits que solo a veces se corresponden con un carácter que una persona señalaría. Tres cosas distintas salen mal, y cualquier texto real se topa con al menos una.
Caracteres que ocupan dos casillas
Todo lo que está por encima de U+FFFF — la mayoría de los emoji, el CJK menos común, todas las escrituras históricas, los alfabetos matemáticos — no cabe en 16 bits y se guarda como un surrogate pair: dos code units que significan algo solo en ese orden. La cara levemente sonriente es U+1F642, guardada como D83D y luego DE42. Invierte el string y pasa a ser DE42 y luego D83D, un low surrogate delante de un high surrogate, que no es ningún carácter. El navegador dibuja dos cuadros de reemplazo.
Acentos que viven en su propia casilla
La é de Café puede ser un solo code point (U+00E9) o dos: una e simple seguida de U+0301, el acento agudo combinante. Se ven idénticos en pantalla y rara vez sabes cuál tienes — el texto copiado de la web y los nombres de archivo de macOS suelen usar la forma de dos partes. Inviértelo y el acento cae delante de la letra a la que pertenecía, pegándose a la letra que ahora tiene delante o flotando solo sobre un círculo punteado. Una palabra pierde su acento y otra distinta gana uno. Lo mismo vale para los signos vocálicos del tailandés, las matras del devanagari y los puntos del hebreo.
Emoji hechos de varios emoji
👩💻 son tres code points: una mujer, un zero-width joiner (U+200D) y una laptop. El joiner es la instrucción de dibujarlos como un solo glifo. Invertida, la secuencia queda laptop, joiner, mujer, y ninguna fuente tiene una forma combinada para eso, así que se desarma en dos emoji sin relación. Las banderas son el caso memorable. Son pares de letras indicadoras regionales, así que invertir la bandera de Australia — las letras A y U — te da la bandera de Ucrania. Nada da error, nada se ve roto. Simplemente obtienes otro país.
Cómo hacerlo bien
Divide el texto en grafemas, las unidades que un lector cuenta como un carácter, en lugar de en code units. En un navegador eso es Intl.Segmenter:
const seg = new Intl.Segmenter(undefined, { granularity: 'grapheme' });
const out = [...seg.segment(text)].map(g => g.segment).reverse().join('');
Expandir el string con [...text] o Array.from es el arreglo a medias que verás recomendado. Itera code points en vez de code units, así que repara el problema del surrogate pair y ninguno de los otros dos — tus emoji sobreviven y tus acentos siguen migrando. La segmentación por grafemas es el único enfoque que resuelve los tres.
El soporte es bueno pero no universal: Chrome lo tiene desde 2020 y Safari desde 2021, mientras que Firefox recién lo lanzó en 2024. En navegadores viejos, la única alternativa es una tabla Unicode grande que tienes que incluir en tu propio código. El inversor enlazado arriba usa lo real donde existe y lo dice debajo de los botones cuando tuvo que caer a code points, porque ahí los acentos sí se mueven.
Invertir una lista no es ordenarla
Invertir el orden de las líneas te da la lista de abajo hacia arriba. Si la lista no estaba ordenada para empezar, ahora tienes una lista desordenada de otra manera — lo cual está bien si querías las entradas más nuevas primero, e inútil si querías de la Z a la A. Son operaciones distintas, y la gente elige la equivocada todo el tiempo. Poner una lista en orden alfabético con la opción descendente es lo que produce Z a A; la inversión solo refleja el orden que ya había.
Un caso en el que la inversión es exactamente lo correcto: comprobar un palíndromo. Quita los espacios y la puntuación, invierte los caracteres, compara. Never odd or even pasa. La mayoría de las cosas que la gente jura que son palíndromos, no lo son.
No inviertas árabe ni hebreo
Las escrituras de derecha a izquierda se guardan en orden lógico — el orden en que las dirías — y el navegador se encarga por su cuenta de mostrarlas de derecha a izquierda. Invertir el string te da un texto que está al revés en memoria y aun así se dibuja de derecha a izquierda, lo que está mal dos veces. Para probar un layout RTL, pon dir="rtl" y usa texto realmente traducido: el texto en alfabeto latino invertido no te dice nada sobre cómo corta líneas el árabe ni sobre dónde cae la puntuación.
También existe un carácter, U+202E, que obliga a todo lo que viene después a mostrarse de derecha a izquierda sea cual sea la escritura. Es una parte legítima del algoritmo bidireccional y también es la forma en que un adjunto cuyo nombre real termina en .exe puede aparecer en un cliente de correo terminando en algo inofensivo. La inversión visible es un truco de fiesta. La inversión que el renderizador hace por ti, disparada por un carácter sin ancho, es la versión que se usa contra las personas.
El texto boca abajo es un disfraz, no una rotación
Voltear el texto cambia cada letra por un carácter Unicode distinto que casualmente se le parece dado vuelta — ɐ es una a volteada tomada del alfabeto fonético, ǝ una e volteada — y después invierte el resultado para que se lea bien con la pantalla boca abajo. Nada gira. El string ahora está hecho de caracteres que significan otra cosa.
Eso importa antes de que vaya a un perfil. Un lector de pantalla anuncia los caracteres reales, así que un nombre volteado se lee como una ristra de símbolos fonéticos. La búsqueda no lo va a encontrar. Las fuentes a las que les faltan esos glifos muestran cuadros, algo todavía común en Android viejo y en lectores de libros electrónicos. Algunas plataformas normalizan o rechazan los caracteres cuando guardas. Y las mayúsculas casi no tienen forma volteada en Unicode, así que salen con figura de minúsculas.
Lo que la inversión no va a hacer por ti
No es una imagen en espejo. Los paréntesis y las comillas siguen mirando hacia donde miraban, así que un (ejemplo) invertido sale como )olpmeje(. Correcto como inversión, incorrecto como espejo. Solo el modo boca abajo intercambia los caracteres emparejados, porque ahí la salida está pensada para leerse.
No es ofuscación. El texto invertido es legible para cualquiera que le dedique un segundo, y cualquier herramienta lo deshace al instante, incluida la que lo creó. Oculta un spoiler y nada más.
No es un cambio de nombre. Si lo que de verdad quieres es userName escrito como user_name, eso es un cambio de convención y no una inversión, y camelCase, snake_case y kebab-case tienen cada uno los lugares donde corresponden.
No tiene idea de qué es tu texto. El marcado, la indentación, las columnas de un CSV y el código salen todos destruidos estructuralmente. Invierte una frase, no un archivo de configuración.
Los cuatro modos están uno al lado del otro en el inversor de texto, que segmenta por grafemas, así que los acentos se quedan en sus letras y un emoji de varias partes vuelve a salir de una pieza. Corre dentro de la página, o sea que lo que pegues nunca sale de tu computadora.
El zero-width joiner que mantiene unido a ese emoji pertenece a toda una familia de caracteres que no puedes ver pero que cambian en silencio lo que hace el texto. Los caracteres invisibles que rompen tu texto cubre el resto de ellos, incluido cómo encontrar los que ya están dentro de algo que alguien te mandó.
Preguntas frecuentes
¿Cómo invierto un string en JavaScript sin romper los emoji?
Divide el string en grafemas en lugar de en code units, usando Intl.Segmenter con granularidad de grafema, y después invierte ese array y únelo. El clásico split('').reverse().join('') rompe cualquier carácter guardado como surrogate pair. Expandir el string con Array.from es mejor, pero sigue moviendo los acentos combinantes y partiendo los emoji unidos.
¿Por qué mi texto invertido muestra cuadros vacíos o signos de interrogación?
La inversión partió un carácter por la mitad. Los emoji y otros caracteres por encima de U+FFFF se guardan como dos mitades de 16 bits que solo son válidas en un orden, así que invertirlas produce una secuencia que ninguna fuente puede dibujar. Un inversor que trabaja con grafemas evita esto por completo.
¿Cómo invierto el orden de las palabras sin cambiar cómo se escribe cada una?
Usa una inversión de orden de palabras y no una inversión de caracteres. Da vuelta la secuencia de palabras de cada línea y deja en paz las letras dentro de cada palabra, así que "one two three" se convierte en "three two one". Invertir los caracteres de todo el texto te daría "eerht owt eno".
¿Se puede invertir texto en árabe o hebreo?
Se puede, pero casi nunca es lo que quieres. El texto de derecha a izquierda se guarda en el orden en que se habla y el navegador se encarga de la dirección visual, así que invertir los caracteres produce un texto que está al revés en memoria y aun así se muestra de derecha a izquierda. Para probar un layout RTL, pon dir="rtl" en el elemento y usa strings realmente traducidos.
¿El texto boca abajo es lo mismo que el texto invertido?
No. El texto boca abajo sustituye cada letra por un carácter Unicode distinto que se parece a esa letra dada vuelta, y después invierte la secuencia. Las letras quedan realmente reemplazadas, así que los lectores de pantalla leen los sustitutos, la búsqueda no encuentra el texto y las fuentes sin esos glifos muestran cuadros vacíos.
Última actualización 19 de septiembre de 2026