Java Unicode 变量名称

2022-09-02 12:33:49

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

撇开约定不谈,我注意到变量具有Unicode字符的名称是合法的,例如,以下内容是合法的:

int \u1234;

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

但是 unicode 1234 是一些埃塞俄比亚字符。那么,什么是真正的“字母”呢?


答案 1

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

来自 Java 语言规范的第 3.8 节

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

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

从文档记录:CharacterisJavaIdentifierPart

确定字符(Unicode 码位)是否可能作为第一个字符以外的 Java 标识符的一部分。如果满足以下任一条件,则字符可能是 Java 标识符的一部分:

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

答案 2

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

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

有关相关的 Unicode 规范,请参阅此处