什么是"Java标识符中可忽略的字符"

Kli*_*cou 10 java intellij-idea

我偶然发现了这个文档,并想知道这是什么.显然,您可以在标识符中包含某些控制字符,并忽略它们:

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`
}
Run Code Online (Sandbox Code Playgroud)

我在JLS中找不到任何相关内容.IntelliJ IDEA在编辑器中给出一个错误,称"dummy"是一个未声明的标识符(但它编译并运行).我猜这是IntelliJ中的一个错误?这些"可忽视的角色"的目的是什么?

(注意:StackOverflow似乎从问题中删除了我的控制字符)

Man*_*dis 7

这个矛盾存在一个悬而未决的问题.

总之,编译器对标识符名称匹配确实忽略了这些字符,但JLS没有提到这一点.相反,JLS说:

两个标识符只有在相同时才相同,即每个字母或数字具有相同的Unicode字符.

也

"Java letter-or-digit"是Character.isJavaIdentifierPart(int)方法返回true的字符

矛盾显而易见:

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

我推测Intellij IDEA遵循JLS,或者他们根本不知道可忽略的字符.我没有看到这个bug报告在这里.

至于这些无知的目的是什么,unicode指定了一些布局和格式控制字符.建议在标识符名称中忽略这些字符

它们所代表的效果是风格的或者超出标识符的范围,其次是因为字符本身通常没有可见的显示

显然,目的isIdentifierIgnorable是识别这一类别的人物.例如,它在isIdentifierIgnorable文档中提到它true为具有FORMAT常规类别值的字符返回,这些字符是具有unicode General_Category值Cf的字符,它们包含在布局和格式控制字符中

  • 虽然如此,但这并没有回答被问到的问题:*"这些"可忽视的角色"服务的目的是什么?"* (2认同)
  • @RealSkeptic:`_`也不是字母或数字,但它在标识符中很重要.:-) (2认同)