2016-04-24 15 views
4

Dieser Code sieht offensichtlich falsch aus und dennoch kompiliert und läuft es auf meinem Computer. Kann jemand erklären, wie das funktioniert? Was zum Beispiel macht das ")" nach dem Klassennamen gültig? Was ist mit den zufällig verstreuten Wörtern?Wie ist dieser gültige Java-Code? (verschleierte Java)

class M‮{public static void main(String[]a‭){System.out.print(new char[]{'H','e','l','l','o',' ','W','o','r','l','d','!'});}} 

-Test online: https://ideone.com/t1W5Vm
Quelle: https://codegolf.stackexchange.com/a/60561

+0

nach links ypu Haben versucht, es in einem Hex-Editor zu öffnen? Es kann einige "umgekehrte" Zeichen geben, die den Buchstaben gespiegelt aussehen lassen. –

+0

Ja, es gibt Unicode-Zeichen mit einer Breite von Null, die dieses * falsch * erscheinen lassen. Wenn Sie versuchen, es richtig einzurücken, werden Sie den Textfluss auf verwirrende Weise bemerken. – dimo414

+0

Peter Lawrey erklärte es auf seinem Blog, wenn ich mich richtig erinnere. Lass mich danach suchen. – Pshemo

Antwort

6

Ein Weg zu entziffern, was passiert, ist, das Programm Zeichen für Zeichen zu betrachten (demo).

Es können Sie entdecken, dass die Zeichen in Positionen 7 und 42 sind spezielles Unicode-Zeichen RLO (von rechts nach links Reihenfolge) und LRO (von links nach rechts Reihenfolge) Zeichen.

Sobald Sie sie entfernen, startet das Programm normal aussehen:

class M{public static void main(String[]a){System.out.print(new char[]{'H','e','l','l','o',' ','W','o','r','l','d','!'});}} 

Der Trick, warum kompiliert das verschleierte Programm ist, dass Java-Compiler diese Sonderzeichen als Format Zeichen ignoriert.

+0

Ah! Das erklärt auch, warum es sich in meinem Texteditor seltsam verhielt! – WoodenKitty

1

Dies gilt Java-Code, aber es nutzt die arabischen "align rechts" unsichtbaren Null-Breite ubicode Zeichen. Versuchen Sie, den Cursor im Text zu platzieren und drücken Sie den Rechtspfeil. Es gibt ine zwischen "M" und ")" und "char []" und "a []".

Ich habe versucht, den Code zu formatieren, aber es ist einfach frustrierend, darin zu navigieren.