这是我在网上找到的一些代码:
class M鈥畕public static void main(String[]a鈥�){System.out.print(new char[] {'H','e','l','l','o',' ','W','o','r','l','d','!'});}}
此代码打印Hello World!到屏幕上;你可以看到它在这里运行。我可以清楚地看到public static void main写的,但它是倒退的。这段代码是如何工作的?这甚至如何编译?
Hello World!
public static void main
编辑: 我在 IntellIJ 中尝试了这段代码,它工作正常。但是,由于某种原因,它在 notepad++ 和 cmd 中不起作用。我还没有找到解决方案,所以如果有人这样做,请在下面评论。
这里有一些不可见的字符会改变代码的显示方式。""在Intellij中,可以通过将代码复制粘贴到一个空字符串(
""
这是该复制粘贴的输出:
"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','!'});}} "
源代码字符按此顺序存储,编译器按此顺序处理,但显示方式不同。
注意\u202E字符,它是一个从右到左的覆盖,开始一个所有字符都被强制从右到左显示的块,以及\u202D一个从左到右的覆盖,开始一个嵌套块,其中所有字符字符被强制为从左到右的顺序,覆盖第一个覆盖。
\u202E
\u202D
因此,当它显示原始代码时,class M正常显示,但是\u202E将所有内容的显示顺序从那里反转到\u202D,这再次反转了所有内容。(正式地,从\u202D到 行终止符的所有内容都被反转了两次,一次是\u202D因为\u202E由于行终止符,下一行的方向性独立于第一行处理,因此{'H','e','l','l','o',' ','W','o','r','l','d','!'});}}正常显示。
class M
{'H','e','l','l','o',' ','W','o','r','l','d','!'});}}
对于完整的(非常复杂,几十页长)Unicode 双向算法,请参阅[Unicode 标准附件