Java标识符中的“连接字符”是什么?

时间:2012-08-02 08:54:27

标签: java unicode identifier scjp

我正在阅读SCJP,我对这一行有疑问:

  

标识符必须以字母,货币字符($)或a开头   连接字符,如下划线(_)。标识符不能   从一个数字开始!

它声明有效的标识符名称可以以连接字符开头,例如下划线。我认为下划线是唯一有效的选择吗?还有哪些连接字符

7 个答案:

答案 0 :(得分:265)

以下是连接字符列表。这些是用于连接单词的字符。

http://www.fileformat.info/info/unicode/category/Pc/list.htm

U+005F _ LOW LINE
U+203F ‿ UNDERTIE
U+2040 ⁀ CHARACTER TIE
U+2054 ⁔ INVERTED UNDERTIE
U+FE33 ︳ PRESENTATION FORM FOR VERTICAL LOW LINE
U+FE34 ︴ PRESENTATION FORM FOR VERTICAL WAVY LOW LINE
U+FE4D ﹍ DASHED LOW LINE
U+FE4E ﹎ CENTRELINE LOW LINE
U+FE4F ﹏ WAVY LOW LINE
U+FF3F _ FULLWIDTH LOW LINE

这在Java 7上编译。

int _, ‿, ⁀, ⁔, ︳, ︴, ﹍, ﹎, ﹏, _;

一个例子。在这种情况下,tp是列的名称和给定行的值。

Column<Double> ︴tp︴ = table.getColumn("tp", double.class);

double tp = row.getDouble(︴tp︴);

以下

for (int i = Character.MIN_CODE_POINT; i <= Character.MAX_CODE_POINT; i++)
    if (Character.isJavaIdentifierStart(i) && !Character.isAlphabetic(i))
        System.out.print((char) i + " ");
}

打印

$ _¢¥¥৲৻૱฿฿‿⁀₠₡₢₣₤₦₨₩₩₩₩₩₰₰₰₰﷼﷼₵₸₸₸﷼﷼﷼﷼ ﹍﹍﹎$ $ _¢£¥₩

答案 1 :(得分:25)

遍历整个65k字符并询问Character.isJavaIdentifierStart(c)。 答案是:&#34;承诺&#34;十进制8255

答案 2 :(得分:7)

合法Java标识符的明确规范可以在Java Language Specification

中找到

答案 3 :(得分:6)

Here is a List连接器Unicode中的字符。你不会在键盘上找到它们。

U + 005F LOW LINE _
U + 203F UNDERTIE‿
U + 2040 CHARACTER TIE⁀
U + 2054倒置UND
U + FE33垂直低线的演示形式_
U + FE34垂直波浪低线的演示形式︴
U + FE4D DASHED LOW LINE﹍
U + FE4E CENTRELINE LOW LINE﹎
U + FE4F WAVY LOW LINE﹏
U + FF3F FULLWIDTH LOW LINE _

答案 4 :(得分:4)

连接字符用于连接两个字符。

在Java中,连接字符是Character.getType(int codePoint) / Character.getType(char ch)返回等于Character.CONNECTOR_PUNCTUATION的值的连接字符。

请注意,在Java中,字符信息基于Unicode标准,该标准通过为连接字符分配通用类别Pc来标识连接字符,该类别是Connector_Punctuation的别名。

以下代码段

for (int i = Character.MIN_CODE_POINT; i <= Character.MAX_CODE_POINT; i++) {
    if (Character.getType(i) == Character.CONNECTOR_PUNCTUATION
            && Character.isJavaIdentifierStart(i)) {
        System.out.println("character: " + String.valueOf(Character.toChars(i))
                + ", codepoint: " + i + ", hexcode: " + Integer.toHexString(i));
    }
}

打印可用于在jdk1.6.0_45上启动标识符的连接字符

character: _, codepoint: 95, hexcode: 5f
character: ‿, codepoint: 8255, hexcode: 203f
character: ⁀, codepoint: 8256, hexcode: 2040
character: ⁔, codepoint: 8276, hexcode: 2054
character: ・, codepoint: 12539, hexcode: 30fb
character: ︳, codepoint: 65075, hexcode: fe33
character: ︴, codepoint: 65076, hexcode: fe34
character: ﹍, codepoint: 65101, hexcode: fe4d
character: ﹎, codepoint: 65102, hexcode: fe4e
character: ﹏, codepoint: 65103, hexcode: fe4f
character: _, codepoint: 65343, hexcode: ff3f
character: ・, codepoint: 65381, hexcode: ff65

以下编译在jdk1.6.0_45,

int _, ‿, ⁀, ⁔, ・, ︳, ︴, ﹍, ﹎, ﹏, _, ・ = 0;

显然,上述声明无法在jdk1.7.0_80&amp; jdk1.8.0_51用于以下两个连接字符(向后兼容性... oops !!!),

character: ・, codepoint: 12539, hexcode: 30fb
character: ・, codepoint: 65381, hexcode: ff65

无论如何,除了详细信息之外, 考试只关注基本拉丁字符集

此外,对于Java中的法律标识,提供了规范here。使用Character类API获取更多详细信息。

答案 5 :(得分:1)

Java标识符中允许的最有趣,最好玩的字符之一(但不是在开头)是名为“Zero Width Non Joiner”的unicode字符(&amp; zwnj;,U + 200C,{{3} })。

我曾经在一个XML中使用过一段XML,该属性值包含对另一段XML的引用。由于ZWNJ是“零宽度”,因此无法看到(除非与光标一起行走,否则它将显示在角色之前)。它也无法在日志文件和/或控制台输出中看到。但它始终存在:copy&amp;粘贴到搜索字段得到它,因此没有找到引用的位置。然而,在搜索字段中键入(可见部分)字符串可以找到引用的位置。我花了一段时间来弄明白这一点。

在使用欧洲键盘布局时,键入零宽度 - 非连接器实际上非常容易(太简单),至少在其德语版本中,例如“Europatastatur 2.02” - 可以通过AltGr +“。”来访问,不幸的是,在大多数键盘上,两个键直接相邻,很容易被意外碰到。

回到Java:我想,你可以写一些像这样的代码:

void foo() {
    int i = 1;
    int i‌ = 2;
}

第二个i附加一个零宽度非连接符(在上面的代码中不能在stackoverflow的编辑器中剪切),但是这不起作用。 IntelliJ(16.3.3)没有抱怨,但JavaC(Java 8)确实抱怨已经定义的标识符 - 似乎JavaC实际上允许ZWNJ字符作为标识符的一部分,但是当使用反射来查看它的作用时,ZWNJ字符被剥离了标识符 - 像‿这样的字符不是。

答案 6 :(得分:0)

你可以在里面你的标识符(而不仅仅是在开头)使用的字符列表很多更有趣:

for (int i = Character.MIN_CODE_POINT; i <= Character.MAX_CODE_POINT; i++)
    if (Character.isJavaIdentifierPart(i) && !Character.isAlphabetic(i))
        System.out.print((char) i + " ");

列表是:

I wanted to post the output, but it's forbidden by the SO spam filter. That's how fun it is!

它包含大多数控制角色!我的意思是钟声和狗屎!你可以让你的源代码响铃!或使用有时仅显示的字符,如软连字符。