Как это действительный код 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
Источник: /questions/6852484/gde-razmestit-kod-glavnoj-stranitsyi-v-prilozhenii-mvc/6852490#6852490

3 ответа

Решение

Один из способов расшифровать происходящее - взглянуть на программу посимвольно ( демо).

Там вы можете обнаружить, что персонажи в позициях 7 а также 42 специальные символы Юникода 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 игнорирует эти специальные символы как символ формата.

Это допустимый код Java, но он использует арабские невидимые символы нулевой ширины ubicode "выровнять по правому краю". Попробуйте поместить курсор в текст и нажмите стрелку вправо. Между "M" и ")" и "char[]" и "a[]" есть одно и то же.

Я пытался отформатировать код, но это просто расстраивает навигацию в нем.

Вы найдете две последовательности 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 справа налево

Другие вопросы по тегам