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

问题描述 投票:0回答:7

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

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

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

java unicode identifier scjp
7个回答
270
投票

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

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 + " ");
}

打印

$ _ ¢ £ ¤ ¥ ¡ ৲ ৳ ৻ ૱ ௹ ฿ ៛ ‿ ⁀ ⁔ ₠ ₡ ₢ ₣ ₤ ₥ ₦ ₧ ₨ ₩ ₪ ₫ € ₭ ₮ ₯ ₰ ₱ ₲ ₳ ₴ ₵ ₶ ₷ ₸ $ ꠸ ﷼ ︳ ︴ ﹍ ﹎ ﹏ ﹩ $ _ ¢ £ ¥ ₩


25
投票

迭代全部 65k 个字符并询问

Character.isJavaIdentifierStart(c)
。 答案是:“undertie”十进制 8255


7
投票

合法 Java 标识符的明确规范可以在 Java 语言规范中找到。


6
投票

这里是 Unicode 中连接器字符的列表。您不会在键盘上找到它们。

U+005F 低线_
U+203F 内衣 ‿
U+2040 字符领带 ⁀
U+2054 倒置内衣 ⁔
U+FE33 垂直低线演示表格 ︳
U+FE34 垂直波浪低线演示表格 ︴
U+FE4D 低虚线﹍
U+FE4E 中心线低线 ﹎
U+FE4F 波浪低线 ﹏
U+FF3F 全宽低线 _


4
投票

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

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

请注意,在 Java 中,字符信息基于 Unicode 标准,该标准通过为连接字符分配通用类别 Pc 来标识连接字符,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 和 jdk1.8.0_51 上编译(向后兼容...哎呀!!!),

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

无论如何,先不谈细节,考试仅关注基本拉丁字符集

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


2
投票

Java 标识符中允许使用的最有趣的字符之一(但不是在开头)是名为“Zero Width Non Joiner”的 unicode 字符(u200c、U+200C、https://en.wikipedia)。 org/wiki/Zero-width_non-joiner)。

我曾经在一个 XML 片段中的一个属性值中遇到过这个,该属性值保存对该 XML 的另一片段的引用。由于 ZWNJ 是“零宽度”,因此无法看到(除非沿着光标行走,否则它会显示在之前的字符上)。它也无法在日志文件和/或控制台输出中看到。但它一直在那里:复制并粘贴到搜索字段中得到它,因此没有找到引用的位置。在搜索字段中键入字符串(可见部分),但找到了引用的位置。我花了一段时间才弄清楚这一点。

使用欧洲键盘布局时,输入零宽度非连接符实际上非常容易(太容易了),至少在其德语变体中,例如“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字符被从标识符中剥离 - 像 ‿ 这样的字符则不会。


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!
它包含了大部分的控制角色!我的意思是铃铛之类的东西!你可以让你的源代码敲响 fn 铃声!或者使用仅有时显示的字符,例如软连字符。

© www.soinside.com 2019 - 2024. All rights reserved.