这里有一些不可见的字符,它们会改变代码的显示方式。在Intellij中,可以通过将代码复制粘贴到空字符串(
"")中来找到它们,该字符串将它们替换为Unipre转义符,消除其影响并显示编译器看到的顺序。
这是该复制粘贴的输出:
"class Mu202E{public static void main(String[]au202D){System.out.print(new char[]n"+ "{'H','e','l','l','o',' ','W','o','r','l','d','!'});}} "源代码字符按此顺序存储,并且编译器将其视为按此顺序存储,但它们的显示方式有所不同。
请注意,该
u202E字符是从右到左的替代,开始一个块,其中所有字符都被强制从右向左显示,而字符
u202D,这是一个从左到右的替代,开始一个嵌套块,其中所有字符被强制为从左到右的顺序,覆盖第一个替代。
Ergo在显示原始代码时
classM会正常显示,但是将
u202E所有内容的显示顺序从那里
u202D颠倒到,从而再次颠倒了一切。(通常,从
u202D到行终止符的所有内容都会反转两次,一次是由于的缘故,一次是由于,
u202D其余的文字由于的缘故而反转
u202E,这就是为什么此文本显示在行的中间而不是结尾的原因。)由于行终止符,下一行的方向性与第一行的方向无关,因此
{'H','e','l','l','o','','W','o','r','l','d','!'});}}可以正常显示。有关完整(极其复杂,长数十页)的Unipre双向算法,请参见Unipre标准附件#9。



