Java Unicode变量名称

我在一个讨论变量命名的论坛中进行了有趣的讨论。

除了惯例之外,我注意到变量具有Unicode字符的名称是合法的,例如以下是合法的:

int \u1234; 

但是,如果我给它命名为#,则会产生错误。 根据Sun的教程 ,如果“以字母开头,美元符号为”$“或下划线字符”_“,则有效。”

但是unicode 1234是一些Ethiopic角色。 那真正被定义为“字母”的是什么?

Unicode标准定义了什么算作字母。

从Java语言规范,第3.8节 :

可以从整个Unicode字符集中绘制字母和数字,该字符集支持当今世界中使用的大多数书写脚本,包括中文,日文和韩文的大集。 这允许程序员在他们的程序中使用以其本地语言编写的标识符。

“Java字母”是Character.isJavaIdentifierStart(int)方法返回true的字符。 “Java letter-or-digit”是Character.isJavaIdentifierPart(int)方法返回true的字符。

从isJavaIdentifierPart的Character文档中:

确定字符(Unicode代码点)是否可能是Java标识符的一部分,而不是第一个字符。 如果满足以下任何条件,则字符可能是Java标识符的一部分:

  • 这是一封信
  • 它是货币符号(例如’$’)
  • 它是一个连接标点字符(例如’_’)
  • 这是一个数字
  • 它是一个数字字母(例如罗马数字字符)
  • 它是一个组合标记
  • 它是一个非间距标记
  • isIdentifierIgnorable(codePoint)为该字符返回true

Unicode字符属于字符类。 有一组Unicode字符属于“字母”类。

Character.isLetter(c)确定Java。 但对于标识符, Character.isJavaIdentifierStart(c)Character.isJavaIdentifierPart(c)更相关。

有关相关的Unicode规范,请参阅此内容 。