【发布时间】:2010-11-28 04:52:28
【问题描述】:
我在一个讨论变量命名的论坛上进行了一次有趣的讨论。
除了约定之外,我注意到变量具有 Unicode 字符的名称是合法的,例如以下是合法的:
int \u1234;
但是,例如,如果我将其命名为 #,则会产生错误。根据Sun's tutorial,如果“以字母开头、美元符号“$”或下划线字符“_”开头,则有效。”
但 unicode 1234 是一些埃塞俄比亚字符。那么什么是真正的“字母”?
【问题讨论】:
我在一个讨论变量命名的论坛上进行了一次有趣的讨论。
除了约定之外,我注意到变量具有 Unicode 字符的名称是合法的,例如以下是合法的:
int \u1234;
但是,例如,如果我将其命名为 #,则会产生错误。根据Sun's tutorial,如果“以字母开头、美元符号“$”或下划线字符“_”开头,则有效。”
但 unicode 1234 是一些埃塞俄比亚字符。那么什么是真正的“字母”?
【问题讨论】:
Unicode 标准定义了什么是字母。
来自Java Language Specification, section 3.8:
字母和数字可能取自 整个 Unicode 字符集, 它支持大多数编写脚本 在当今世界使用,包括 大集中文、日文和 韩国人。这允许程序员使用 他们的程序中的标识符是 用他们的母语写成。
一个 “Java 字母”是一个字符 方法 Character.isJavaIdentifierStart(int) 返回真。 “Java 字母或数字” 是该方法所针对的字符 Character.isJavaIdentifierPart(int) 返回真。
来自CharacterisJavaIdentifierPart 的文档:
确定字符(Unicode 代码点)是否可以像其他标识符一样是 Java 标识符的一部分 比第一个字符。 如果满足以下任一条件,则字符可能是 Java 标识符的一部分:
- 这是一封信
- 它是一个货币符号(例如'$')
- 是连接标点符号(如'_')
- 是一个数字
- 是数字字母(如罗马数字字符)
- 它是一个组合标记
- 它是一个非间距标记
- isIdentifierIgnorable(codePoint) 为字符返回 true
【讨论】:
Unicode 字符属于字符类。有一组 Unicode 字符属于“字母”类。
由 Character.isLetter(c) 确定,用于 Java。但对于标识符,Character.isJavaIdentifierStart(c) 和 Character.isJavaIdentifierPart(c) 更相关。
有关相关的 Unicode 规范,请参阅 this。
【讨论】: