这个有效的 Java 代码如何? (混淆Java)

How is this valid Java code? (obfuscated Java)

这段代码看起来显然不正确,但它在我的机器上编译并运行得很愉快。有人可以解释这是如何工作的吗?例如,是什么让 class 名称后的“)”有效?散布在周围的随机单词呢?

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

这是有效的 java 代码,但它使用阿拉伯语 "align right" 不可见的零宽度 ubicode 字符。尝试将光标放在文本中,然后按向右箭头。 "M"和")"之间有一个"char[]"和"a[]".

我尝试格式化代码,但在其中导航实在令人沮丧。

破译正在发生的事情的一种方法是逐个字符地查看程序 (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 编译器忽略这些特殊字符作为 格式字符 .

您会在源代码中找到两个 unicode 序列

0xE2 0x80 0xAE http://www.fileformat.info/info/unicode/char/202e/index.htm

0xE2 0x80 0xAD http://www.fileformat.info/info/unicode/char/202d/index.htm

有效地编写部分: {public static void main(String[]a 从右到左