Что такое "невежественный символ в Java-идентификаторе",

Я наткнулся на этот doc и подумал, что это значит. Очевидно, вы можете иметь определенные контрольные символы внутри идентификаторов, и они игнорируются:

public static void main(String[] args) throws Exception {
    int dummy = 123;
    System.out.println(d​ummy); // Has U+200B after the `d` before the `u`
}

Я не мог найти ничего об этом в JLS. IntelliJ IDEA выдает ошибку в редакторе, говоря, что "dummy" является незаявленным идентификатором (но тем не менее он компилируется и запускается). Я предполагаю, что ошибка в IntelliJ? Какую цель выполняют эти "игнорируемые символы"?

(Примечание: StackOverflow, похоже, удаляет мои контрольные символы из вопроса)

Ответ 1

Для этого противоречия существует открытая проблема.

Таким образом, эти символы действительно игнорируются для сопоставления имени идентификатора компилятором, но JLS не упоминает об этом. Вместо JLS говорит:

Два идентификатора одинаковы, только если они идентичны, то есть имеют один и тот же символ Юникода для каждой буквы или цифры.

Кроме

"Буква или цифра Java" - это символ, для которого метод Character.isJavaIdentifierPart(int) возвращает true

Противоречие очевидно как:

Character.isJavaIdentifierPart('\u0001')  -> true, so used to compare identifier names
Character.isIdentifierIgnorable('\u0001') -> true, should be ignored actually

Я предполагаю, что Intellij IDEA следует за JLS или они просто не знают о незнакомых персонажах. Я не вижу отчета об ошибке для этого здесь.

Что касается цели этих игнорируемых, unicode указывает некоторые Макросы и символы управления форматом. Предполагается, что эти символы следует игнорировать в именах идентификаторов как

эффекты, которые они представляют, являются стилистическими или иначе недоступными для идентификаторы, а во-вторых, поскольку сами символы часто имеют нет видимого отображения

Очевидно, целью isIdentifierIgnorable является идентификация персонажей этой категории. Например, он упоминал в isIdentifierIgnorable documentation, что он возвращает true для символов, которые имеют общее значение категории FORMAT, которые являются символами с индексом unicode General_Category Cf, которые включены в символы макета и управления форматом