首先,我知道这违背了所有的惯例和建议,但我无论如何都想这么做。
我如何(或者是否可能)使用标识符(方法名、变量名等)中的unicode字符编译java代码
我希望能够做以下事情:
public class extends {
public void сделайЧтонибудь() { ... }
}
完全荒谬的例子,但你明白了。
不,你不能。
标识符必须以所谓的Java字母开头,即
[…]方法
Character.isJavaIdentifierStart(int)
为其返回true
的字符。
这反过来意味着
当且仅当以下条件之一为真时,字符[
ch
]可以启动Java标识符:
isLetter(ch)
返回truegetType(ch)
返回LETTER_NUMBERch
是货币符号(如"$")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)。