如何使用标识符中的unicode字符编译java



首先,我知道这违背了所有的惯例和建议,但我无论如何都想这么做。

我如何(或者是否可能)使用标识符(方法名、变量名等)中的unicode字符编译java代码

我希望能够做以下事情:

public class    extends    {
public void сделайЧтонибудь() { ... }
}

完全荒谬的例子,但你明白了。

不,你不能。

标识符必须以所谓的Java字母开头,即

[…]方法Character.isJavaIdentifierStart(int)为其返回true的字符。

这反过来意味着

当且仅当以下条件之一为真时,字符[ch]可以启动Java标识符:

  • isLetter(ch)返回true
  • getType(ch)返回LETTER_NUMBER
  • ch是货币符号(如"$")
  • ch是一个连接标点符号(如"_")

(可选)后续字符必须是Java字母或数字,即

[…]方法Character.isJavaIdentifierPart(int)为其返回true的字符。

这反过来意味着

如果以下任何条件成立,字符可能是Java标识符的一部分:

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

以上任何一项都不适用于或,但适用于事实上是有效标识符的сделайЧтонибудь


你能做的(为什么麻烦,tho)是编写一个预处理器,将这些表情符号翻译成Java字母序列,其输出是一个带有有效标识符的Java程序,你可以最终将其提供给编译器。

这不是有效的Java,所以您不能"制造";它编译。选择规范定义的有效标识符名称:

https://docs.oracle.com/javase/specs/jls/se18/html/jls-3.html#jls-3.8

标识符可以包含";Java字母";或";Java数字";,unicode,但不允许使用任意unicode符号:

;Java字母";包括大写和小写ASCII拉丁字母A-Z(\u0041-\u005a)和A-Z(\u0061-\u007a),以及由于历史原因,ASCII美元符号($,或\u0024)和下划线(_,或\u005f)。美元符号只能在机械生成的源代码中使用,或者很少用于访问遗留系统上预先存在的名称。下划线可以用于由两个或多个字符组成的标识符,但由于是关键字,因此不能用作一个字符的标识符。

;Java数字";包括ASCII数字0-9(\u0030-\u0039)。

相关内容

  • 没有找到相关文章

最新更新