Saltar al contenido

¿Por qué este código, escrito al revés, imprime “Hello World!”

Luego de buscar en diferentes repositorios y foros al concluir descubrimos la solución que te enseñamos pronto.

Solución:

Aquí hay caracteres invisibles que alteran cómo se muestra el código. En Intellij, estos se pueden encontrar copiando y pegando el código en un espacio vacío. string (""), que los reemplaza con escapes Unicode, eliminando sus efectos y revelando el orden que ve el compilador.

Aquí está el resultado de ese copiar y pegar:

"class Mu202Epublic static void main(String[]au202D)System.out.print(new char[]n"+
        "'H','e','l','l','o',' ','W','o','r','l','d','!');   "

Los caracteres del código fuente se almacenan en este orden y el compilador los trata como si estuvieran en este orden, pero se muestran de manera diferente.

Nota la u202E carácter, que es una anulación de derecha a izquierda, comenzando un bloque donde todos los caracteres están obligados a mostrarse de derecha a izquierda, y el u202D, que es una anulación de izquierda a derecha, que inicia un bloque anidado donde todos los caracteres se fuerzan en orden de izquierda a derecha, anulando la primera anulación.

Ergo, cuando muestra el código original, class M se muestra normalmente, pero el u202E invierte el orden de visualización de todo desde allí hasta el u202D, que vuelve a revertir todo. (Formalmente, todo desde el u202D al terminador de línea se invierte dos veces, una debido a la u202D y una vez con el resto del texto invertido debido a la u202E, por lo que este texto aparece en el medio de la línea en lugar del final). La direccionalidad de la siguiente línea se maneja independientemente de la primera debido al terminador de línea, por lo que 'H','e','l','l','o',' ','W','o','r','l','d','!');}} se muestra normalmente.

Para obtener el algoritmo bidireccional Unicode completo (extremadamente complejo, decenas de páginas), consulte el anexo 9 del estándar Unicode.

Se ve diferente debido a la Algoritmo bidireccional Unicode. Hay dos caracteres invisibles de RLO y LRO que utiliza el algoritmo bidireccional Unicode para cambiar la apariencia visual de los caracteres anidados entre estos dos metacaracteres.

El resultado es que visualmente se ven en orden inverso, pero los personajes reales en memoria no se invierten. Puedes analizar los resultados aquí. El compilador de Java ignorará RLO y LRO, y los tratará como espacios en blanco, razón por la cual se compila el código.

Nota 1: Los editores de texto y los navegadores utilizan este algoritmo para mostrar visualmente caracteres LTR (inglés) y RTL (p. Ej. Árabe, hebreo) juntos al mismo tiempo, por lo tanto, “bi” direccional. Puede leer más sobre el algoritmo bidireccional en el sitio web de Unicode.
Nota 2: El comportamiento exacto de LRO y RLO se define en la Sección 2.2 del Algoritmo.

El personaje U+202E refleja el código de derecha a izquierda, aunque es muy inteligente. Se esconde comenzando en la M,

"class Mu202E{..."

¿Cómo encontré el magia ¿detras de esto?

Bueno, al principio cuando vi la pregunta pensé, “es una especie de broma, perder el tiempo de alguien más”, pero luego, abrí mi IDE (“IntelliJ”), creé una clase y pasé el código … y compiló!!! Entonces, miré mejor y vi que el “público static void”estaba al revés, así que fui allí con el cursor, y borrar algunos caracteres… ¿Y que pasa? Los caracteres comenzaron a borrarse al revés, entonces, pensé mmm …. raro … tengo que ejecutarlo … Entonces procedo a ejecutar el programa, pero primero necesitaba para salvarlo… y eso fue cuando lo encontré!. No pude guardar el archivo porque mi IDE dijo que había una codificación diferente para algunos caracteres, y apuntame donde estaba, Así que empiezo una búsqueda en Google de caracteres especiales que podrían hacer el trabajo, y eso es todo 🙂

Un poco sobre

el algoritmo bidireccional Unicode, y U+202E involucrado, una breve explicación:

El estándar Unicode prescribe un orden de representación de la memoria conocido como orden lógico. Cuando el texto se presenta en líneas horizontales, la mayoría de los guiones muestran caracteres de izquierda a derecha. Sin embargo, hay varias escrituras (como árabe o hebreo) en las que el orden natural del texto horizontal en pantalla es de derecha a izquierda. Si todo el texto tiene una dirección horizontal uniforme, entonces el orden del texto de visualización es inequívoco.

Sin embargo, debido a que estos guiones de derecha a izquierda usan dígitos que se escriben de izquierda a derecha, el texto es en realidad bidireccional: una mezcla de texto de derecha a izquierda y de izquierda a derecha. Además de los dígitos, las palabras incrustadas en inglés y otras escrituras también se escriben de izquierda a derecha, lo que también produce texto bidireccional. Sin una especificación clara, pueden surgir ambigüedades al determinar el orden de los caracteres mostrados cuando la dirección horizontal del texto no es uniforme.

Este anexo describe el algoritmo utilizado para determinar la direccionalidad del texto Unicode bidireccional. El algoritmo extiende el modelo implícito empleado actualmente por una serie de implementaciones existentes y agrega caracteres de formato explícitos para circunstancias especiales. En la mayoría de los casos, no es necesario incluir información adicional con el texto para obtener un orden de visualización correcto.

Sin embargo, en el caso de texto bidireccional, hay circunstancias en las que un orden bidireccional implícito no es suficiente para producir un texto comprensible. Para tratar estos casos, se define un conjunto mínimo de caracteres de formato direccional para controlar el orden de los caracteres cuando se procesan. Esto permite un control exacto del orden de la pantalla para un intercambio legible y garantiza que el texto sin formato utilizado para elementos simples como nombres de archivos o etiquetas siempre se pueda ordenar correctamente para su visualización.

¿Por qué crear un algoritmo como este?

el algoritmo bidi puede representar una secuencia de caracteres árabes o hebreos uno tras otro de derecha a izquierda.

Reseñas y puntuaciones

Recuerda dar recomendación a este tutorial si te fue de ayuda.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *