Hier gibt es unsichtbare Zeichen, die die Anzeige des Codes ändern. In Intellij können Sie diese finden, indem Sie den Code in eine leere Zeichenfolge ( ""
) kopieren , die sie durch Unicode-Escapezeichen ersetzt, ihre Effekte entfernt und die Reihenfolge anzeigt , die der Compiler sieht.
Hier ist die Ausgabe dieses Copy-Paste:
"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','!'});}} "
Die Quellcodezeichen werden in dieser Reihenfolge gespeichert, und der Compiler behandelt sie als in dieser Reihenfolge, sie werden jedoch unterschiedlich angezeigt.
Beachten Sie das \u202E
Zeichen, bei dem es sich um eine Überschreibung von rechts nach links handelt, das einen Block startet, in dem alle Zeichen von rechts nach links angezeigt werden müssen, und das Zeichen, bei dem es sich um eine Überschreibung von \u202D
links nach rechts handelt, bei dem ein verschachtelter Block beginnt, bei dem alle Zeichen angezeigt werden Zeichen werden in eine Reihenfolge von links nach rechts gezwungen, wobei die erste Überschreibung überschrieben wird.
Ergo wird, wenn der ursprüngliche Code class M
angezeigt wird, normal angezeigt, aber das \u202E
kehrt die Anzeigereihenfolge von allem von dort zu dem um \u202D
, wodurch alles wieder umgekehrt wird. (Formal wird alles vom \u202D
bis zum Zeilenendezeichen zweimal umgekehrt, einmal aufgrund des \u202D
und einmal, wobei der Rest des Textes aufgrund des umgekehrt \u202E
wird, weshalb dieser Text in der Mitte der Zeile statt am Ende angezeigt wird.) Die Direktionalität der nächsten Zeile wird aufgrund des Zeilenabschlusses unabhängig von der der ersten behandelt und wird daher {'H','e','l','l','o',' ','W','o','r','l','d','!'});}}
normal angezeigt.
Den vollständigen (äußerst komplexen, Dutzende von Seiten langen) bidirektionalen Unicode-Algorithmus finden Sie im Unicode-Standardanhang Nr. 9 .