web-dev-qa-db-ja.com

Java識別子の「接続文字」とは何ですか?

私はSCJPを読んでいますが、この行に関して質問があります:

識別子は、文字、通貨文字($)、またはアンダースコア(_)などの接続文字で始まる必要があります。識別子を数字で始めることはできません!

有効な識別子名は、接続文字などアンダースコアで始まることができると述べています。アンダースコアが唯一の有効なオプションだと思いましたか?他に接続文字がありますか?

204
LuckyLuke

接続文字のリストは次のとおりです。これらは単語を接続するために使用される文字です。

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

プリント

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

265
Peter Lawrey

65k文字全体を反復処理し、Character.isJavaIdentifierStart(c)に問い合わせます。答えは次のとおりです。「undertie」decimal 8255

25

正当なJava識別子の決定的な仕様は、 Java言語仕様 にあります。

7
Greg Hewgill

ここにリストがあります Unicodeのコネクタ文字。キーボードにはありません。

U + 005Fローライン_
U + 203F UNDERTIE‿
U + 2040キャラクタータイ⁀
U + 2054 INVERTED UNDERTIE⁔
U + FE33垂直低線用のプレゼンテーションフォーム︳
U + FE34垂直波状ローラインのプレゼンテーションフォーム︴
U + FE4D破線ローライン﹍
U + FE4E CENTRELINE LOW LINE﹎
U + FE4F WAVY LOW LINE﹏
U + FF3F全幅ローライン_

6
Simulant

接続文字は、2つの文字を接続するために使用されます。

Javaでは、接続文字は Character.getType(int codePoint) / Character.getType(char ch)Character .CONNECTOR_PUNCTUATION

Javaでは、文字情報はUnicode標準に基づいていることに注意してください。これは、接続文字に Connector_Punctuation のエイリアスである一般カテゴリPcを割り当てることで接続文字を識別します。

次のコードスニペット、

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;

どうやら、上記の宣言は、次の2つの接続文字(下位互換性...おっと!!!)のjdk1.7.0_80およびjdk1.8.0_51でのコンパイルに失敗したようです。

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

とにかく、詳細はさておき、基本的なラテン文字セットのみに焦点を当てています

また、Javaの法的識別子については、仕様が提供されます here 。 CharacterクラスAPIを使用して、詳細を取得します。

4
sxnamit

Java識別子で許可される最も楽しい文字の1つ(ただし、開始時ではありません)は、「ゼロ幅非結合」という名前のUnicode文字です(&zwnj;、U + 200C、 https://en.wikipedia.org/wiki/Zero-width_non-joiner )。

これは、XMLの別の部分への参照を保持している属性値内のXMLの部分に一度ありました。 ZWNJは「ゼロ幅」であるため、見ることができません(カーソルと一緒に歩いている場合を除き、前のキャラクターのすぐ上に表示されます)。また、ログファイルおよび/またはコンソール出力で見ることができませんでした。しかし、それは常に存在していました。コピーして検索フィールドに貼り付けて取得したため、参照された位置が見つかりませんでした。ただし、検索フィールドに文字列(の一部)を入力すると、参照位置が見つかりました。これを理解するためにしばらく時間がかかりました。

Zero-Width-Non-Joinerを入力するのは、少なくともドイツ語版でヨーロッパのキーボードレイアウトを使用する場合、実際には非常に簡単です(非常に簡単です)。 "Europatastatur 2.02"-AltGr + "。"で到達可能です。2つのキーは、残念ながらほとんどのキーボードで互いに直接隣り合って配置されており、偶然に簡単にヒットする可能性があります。

Javaに戻る:よく考えて、次のようなコードを書くことができます。

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

2番目のiにはゼロ幅の非ジョイナーが追加されます(上記のコードではstackoverflowのエディターで切り取られていません)が、機能しませんでした。 IntelliJ(16.3.3)は文句を言いませんでしたが、JavaC(Java 8)はすでに定義された識別子について文句を言いました-JavaCは実際に識別子の一部としてZWNJ文字を許可しているようですが、リフレクションを使用してそれが何をするかを見ると、ZWNJ文字は識別子から取り除かれます-likeのような文字はそうではありません。

1
Ulrich Grepel

使用できる文字のリストinside(開始時ではなく)識別子はmuchより楽しいです:

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のベルを鳴らすことができます!または、ソフトハイフンなど、時々しか表示されない文字を使用します。

0