小编典典

为什么这段代码,倒写,打印“Hello World!”

all

这是我在网上找到的一些代码:

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写的,但它是倒退的。这段代码是如何工作的?这甚至如何编译?

编辑: 我在 IntellIJ 中尝试了这段代码,它工作正常。但是,由于某种原因,它在 notepad++ 和 cmd
中不起作用。我还没有找到解决方案,所以如果有人这样做,请在下面评论。


阅读 123

收藏
2022-05-12

共1个答案

小编典典

这里有一些不可见的字符会改变代码的显示方式。""在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一个从左到右的覆盖,开始一个嵌套块,其中所有字符字符被强制为从左到右的顺序,覆盖第一个覆盖。

因此,当它显示原始代码时,class M正常显示,但是\u202E将所有内容的显示顺序从那里反转到\u202D,这再次反转了所有内容。(正式地,从\u202D
行终止符的所有内容都被反转了两次,一次是\u202D因为\u202E由于行终止符,下一行的方向性独立于第一行处理,因此{'H','e','l','l','o',' ','W','o','r','l','d','!'});}}正常显示。

对于完整的(非常复杂,几十页长)Unicode 双向算法,请参阅[Unicode 标准附件

9](http://unicode.org/reports/tr9/)。

2022-05-12