我在一个讨论变量命名的论坛中进行了一次有趣的讨论。
除了惯例之外,我注意到变量具有Unicode字符的名称是合法的,例如以下是合法的:
int \u1234;
但是,例如,如果我给它命名为#,则会产生错误。根据{{3}},如果以字母开头,美元符号“$”或下划线字符“_”,则有效。“
但是unicode 1234是一些Ethiopic角色。那真正被定义为“字母”的是什么?
答案 0 :(得分:20)
Unicode标准定义了什么算作字母。
来自Java Language Specification, section 3.8:
可以绘制字母和数字 整个Unicode字符集, 它支持大多数写脚本 今天在世界上使用,包括 适用于中文,日文和日文的大型套装 韩国人。这允许程序员使用 他们的程序中的标识符 用他们的母语写成。
一个 “Java letter”是一个角色 方法 Character.isJavaIdentifierStart(INT) 返回true。一个“Java字母或数字” 是一个方法的字符 Character.isJavaIdentifierPart(INT) 返回true。
来自Character
的{{1}}文件:
确定字符(Unicode代码点)是否可能是其他Java标识符的一部分 比第一个角色。 如果满足以下任何条件,则字符可能是Java标识符的一部分:
- 这是一封信
- 它是货币符号(例如'$')
- 它是一个连接标点字符(例如'_')
- 这是一个数字
- 它是一个数字字母(例如罗马数字字符)
- 是一个组合标记
- 这是一个非间距标记
- isIdentifierIgnorable(codePoint)为字符
返回true
答案 1 :(得分:4)
Unicode字符属于字符类。有一组Unicode字符属于“字母”类。
由Character.isLetter(c)
确定为Java。但对于标识符,Character.isJavaIdentifierStart(c)
和Character.isJavaIdentifierPart(c)
更相关。
有关相关的Unicode规范,请参阅this。