2016-04-24 8 views
4

このコードは明らかに間違っているようですが、私のマシン上でうまくコンパイルして実行します。誰かがこの仕組みを説明することはできますか?たとえば、クラス名の後ろにある ")"を有効にするのは何ですか?周りに散らばっているランダムな言葉はどうですか?このJavaコードはどのように有効ですか? (難読化されたJava)

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

テストオンライン:https://ideone.com/t1W5Vm
出典:https://codegolf.stackexchange.com/a/60561

+0

持っypuを左に {public static void main(String[]a権利をそれを16進エディタで開こうとしましたか?文字が見えるようにする「逆の」文字があるかもしれません。 –

+0

はい、この*が表示されないようにするための幅のないUnicode文字があります。あなたがそれを正しくインデントしようとすると、テキストフローが混乱していることに気付くでしょう。 – dimo414

+0

Peter Lawreyは私が正しく覚えていれば彼のブログでそれを説明しました。私はそれを検索させてください。 – Pshemo

答えて

6

一つの方法は、プログラムの文字単位(demo)を見ることです。そこ

あなたが位置742の文字が特殊なUnicode文字であることを発見するかもしれRLO(右から左へ順)とLRO(左から右の順)の文字。

あなたがそれらを削除すると、プログラムが正常に見えるし始め:難読化プログラムのコンパイルなぜ

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

トリックはJavaコンパイラはフォーマット文字としてこれらの特殊文字を無視するということです。

+0

ああ!それはなぜ私のテキストエディタで奇妙な動作を続けたのかを説明します。 – WoodenKitty

1

これは、有効なJavaコードがあるが、それはアラビア "右揃え" 不可視のゼロ幅ubicode文字を使用しています。テキストにカーソルを置き、右矢印を押してください。 "M"と ")"と "char []"と "a []"があります。

私はコードをフォーマットしようとしましたが、それをナビゲートするのはちょっとイライラしています。何が起こっているかを解読する

関連する問題