Java Unicode变量名

21
我在一个论坛上参与了一个有趣的讨论,我们讨论的是变量的命名。
撇开约定俗成的规范不谈,我注意到一个变量可以使用Unicode字符作为名称是合法的。例如,下面的命名是合法的:
int \u1234;

然而,如果我例如给它命名为#,它会产生一个错误。根据Sun的教程,如果以字母、美元符号"$"或下划线字符"_"开头,那么它是有效的。
但是Unicode 1234是一些埃塞俄比亚字符。那么什么才真正被定义为"字母"呢?

我来到这里是因为我在为一项测试编写场景表格,我想使用类似AUTH_✅AUTH_❌这样的枚举常量,这样一切都能很好地对齐,并且一目了然。我实际上很惊讶地发现这些类型的字符在标识符中是不允许的。 - undefined
2个回答

30

Unicode标准定义了什么是字母。

来自Java语言规范第3.8节

字母和数字可以从整个Unicode字符集中提取,该字符集支持当今世界上使用的大多数书写脚本,包括汉字,日语和韩语的大型集合。这允许程序员在其程序中使用以其母语编写的标识符。

"Java字母"是一种方法Character.isJavaIdentifierStart(int)返回true的字符。"Java字母或数字"是一种方法Character.isJavaIdentifierPart(int)返回true的字符。

来自Character文档的isJavaIdentifierPart

确定字符(Unicode代码点)是否可以作为Java标识符的一部分,除了第一个字符之外。如果以下任何一项为真,则字符可能是Java标识符的一部分:

  • 它是一个字母
  • 它是一个货币符号(例如'$')
  • 它是一个连接的标点符号(例如'_')
  • 它是一个数字
  • 它是一个数字字母(例如罗马数字字符)
  • 它是一个组合标记
  • 它是一个非间隔标记
  • isIdentifierIgnorable(codePoint)对于该字符返回true

8
Unicode字符属于字符类别。有一组Unicode字符属于“字母”类别。
在Java中,可以通过Character.isLetter(c)来确定。但对于标识符而言,Character.isJavaIdentifierStart(c)Character.isJavaIdentifierPart(c)更为相关。
有关相关的Unicode规范,请参见此网页

我发现这个答案简明扼要,正好符合我的要求。另一个答案也有我在寻找的内容,但是包含了太多东西,所以我先注意到了这个答案。 - KANJICODER

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接