Il y a des caractères invisibles ici qui modifient la façon dont le code est affiché. Dans l'Ide, ceux-ci peuvent être trouvés par un copier-coller le code dans une chaîne vide (""
), qui remplace avec Unicode s'échappe, la suppression de leurs effets et de révéler l'ordre le compilateur voit.
Voici la sortie de ce copier-coller:
"class M\u202E{public static void main(String[]a\u202D){System.out.print(new char[]\n"+
"{'H','e','l','l','o',' ','W','o','r','l','d','!'});}} "
Le code source caractères sont stockés dans cet ordre, et le compilateur traite comme étant dans cet ordre, mais ils sont affichées de manière différente.
Remarque l' \u202E
personnage, qui est un droit-à-gauche pour les remplacer, le démarrage d'un bloc, où tous les personnages sont contraints à être affiché de droite à gauche, et l' \u202D
, ce qui est à gauche-à-droite pour les remplacer, à partir d'un bloc imbriqué où tous les personnages sont forcés de gauche à droite, en remplaçant le premier remplacement.
Ergo, lorsqu'il affiche le code d'origine, class M
s'affiche normalement, mais l' \u202E
renverse l'ordre d'affichage de tout, de là, à l' \u202D
, ce qui inverse tout nouveau. (Officiellement, de tout, de la \u202D
pour le terminateur de ligne obtient inversé deux fois, une fois en raison de l' \u202D
et une fois avec le reste du texte inversé en raison de l' \u202E
, ce qui explique pourquoi ce texte s'affiche dans le milieu de la ligne, au lieu de la fin.) La ligne suivante est la directivité est géré de façon indépendante de la première en raison de la terminaison de ligne, de sorte {'H','e','l','l','o',' ','W','o','r','l','d','!'});}}
est affiché normalement.
Pour la version intégrale (extrêmement complexe, de plusieurs dizaines de pages) algorithme bidirectionnel Unicode, voir le Standard Unicode Annexe n ° 9.