जावा आइडेंटिफ़ायर में "कनेक्टिंग कैरेक्टर्स" क्या हैं?


208

मैं SCJP के लिए पढ़ रहा हूं और इस लाइन के बारे में मेरा एक सवाल है:

पहचानकर्ताओं को एक पत्र, एक मुद्रा चरित्र ($), या एक कनेक्टिंग चरित्र जैसे कि अंडरस्कोर (_) से शुरू करना चाहिए। पहचानकर्ता एक नंबर से शुरू नहीं हो सकता है!

यह बताता है कि एक वैध पहचानकर्ता का नाम एक जोड़ने वाले चरित्र जैसे कि अंडरस्कोर के साथ शुरू हो सकता है । मुझे लगा कि अंडरस्कोर केवल वैध विकल्प था? अन्य कनेक्टिंग कैरेक्टर क्या हैं?


2
"एक मुद्रा चरित्र" के बारे में: इस सवाल पर ब्रिटेन के आगंतुक आश्चर्यचकित हो सकते हैं और यह जानने में रुचि रखते हैं कि, एक "मुद्रा चरित्र" के साथ शुरू करने में सक्षम होने के कारण, जावा पहचानकर्ता, कानूनी तौर पर पाउंड प्रतीक (पाउंड) के साथ शुरू कर सकते हैं।
8bitjunkie

11
ध्यान दें कि जावा 8 के बाद से, _एक "पदावनत" पहचानकर्ता है। विशेष रूप से, संकलक निम्नलिखित चेतावनी का उत्सर्जन करता है: (पहचानकर्ता के रूप में '_' का उपयोग जावा एसई 8 के बाद रिलीज में समर्थित नहीं हो सकता है)
ऐयोबे

4
@aioobe युप। ब्रायन गोएट्ज़ कहते हैं कि वे _भविष्य की भाषा सुविधाओं में उपयोग के लिए "पुनः प्राप्त" कर रहे हैं । एक अंडरस्कोर के साथ शुरू होने वाले पहचानकर्ता अभी भी ठीक हैं, लेकिन एक एकल अंडरस्कोर एक त्रुटि है अगर एक लैम्ब्डा पैरामीटर नाम के रूप में उपयोग किया जाता है, और हर जगह एक चेतावनी।
बोअन

1
बाइटेकोड के लिए, अनुक्रम के अनुसार कुछ भी नहीं होता . ; [ / < > :है: stackoverflow.com/questions/26791204/… docs.oracle.com/javase/specs/jvms/se7/html/… बाकी सब जावा-केवल प्रतिबंध है।
सिरो सेंटिल्ली। Iro i 法轮功 ''

@Boann मजेदार बात यह है कि वे लैम्बदास में इसके उपयोग को रोक रहे हैं, लेकिन यह संभवत: "इस तर्क को नजरअंदाज करने वाला" पहचानकर्ता के रूप में वापस आएगा, जिसका उपयोग उदाहरण के लिए लैम्ब्डा में किया जाएगा। मैंने इसे इस तरह उपयोग करने की कोशिश की _, _ -> doSomething();:।
उपयोगकर्ता 31389

जवाबों:


268

यहां पात्रों को जोड़ने की एक सूची दी गई है। ये शब्द जोड़ने के लिए उपयोग किए जाने वाले वर्ण हैं।

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

यह जावा 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 + " ");
}

प्रिंट

$ _ £ _ _ ﹩ _ _ _ _


109
मैं उस दिन का इंतजार कर रहा हूं जब मुझे कुछ कोड विरासत में मिले जो इन पहचानकर्ताओं का उपयोग करता है!
मार्को टोपोलनिक

58
@MarkoTopolnik सावधान रहें कि आप क्या चाहते हैं। ;)
पीटर लॉरी

3
BTW आप किसी भी मुद्रा प्रतीक का उपयोग कर सकते हैं। int ৲, ¤, ₪₪₪₪;: D
पीटर लॉरी

17
मैं अपने कोड में इनमें से एक या दो फेंक सकता हूं, सिर्फ किक के लिए! और यह जांचने के लिए कि क्या बिल्ड सिस्टम वास्तव में UTF-8 अनुपालन है।
मार्को टोपोलनिक

82
@GrahamBorland कैसे के बारे में if( ⁀ ‿ ⁀ == ⁀ ⁔ ⁀) या if ($ == $)या if (¢ + ¢== ₡)याif (B + ︳!= ฿)
पीटर Lawrey

25

पूरे 65k चार्ट के माध्यम से पुनरावृति करें और पूछें Character.isJavaIdentifierStart(c)। जवाब है: "अंडरआई" दशमलव 8255


14
मैं विरोध नहीं कर सकता (स्काला में): (1 to 65535).map(_.toChar).filter(Character.isJavaIdentifierStart).size- पैदावार 48529 अक्षर ...
टोमाज़ नर्कविक्ज़

65k और 12k और 8.5k आदि के पास कुछ वर्ण प्रतीत होते हैं
मार्कस मिककोलेनैन

अगर आप कहते हैं कि "उपज नहीं है!" और "!! डेटिड"
मार्कस मिककोलेनैन

2546 + 2547 कम से कम "बॉक्स ड्राइंग ..."
मार्कस मिककोलेनैन 9

3
कुल संख्या = 90648, लेकिन मैं जा रहा हूं Character.MAX_CODE_POINT, जो शायद इससे अधिक है 2<<16
मार्टिअन कोर्टको

7

एक कानूनी जावा पहचानकर्ता के निश्चित विनिर्देश जावा भाषा विनिर्देश में पाए जा सकते हैं ।


3
मुझे यकीन नहीं है कि वास्तव में पूरी तरह से (निहित) सवाल का जवाब देता है कि कौन से अक्षर जावा पहचानकर्ता शुरू कर सकते हैं। निम्नलिखित लिंक्स के द्वारा हम Character.isJavaIdentifierStart () पर लिखते हैं, जो बताता है कि एक चरित्र एक जावा आइडेंटिफ़ायर शुरू कर सकता है यदि और केवल तभी यदि निम्न में से कोई एक सत्य है: ch एक मुद्रा प्रतीक है ( जैसे कि "$"); ch एक कनेक्टिंग विराम चिह्न वर्ण है ( जैसे "_")।
एक CVn

1
ऐसा लगता है कि विनिर्देश कार्यान्वयन के लिए स्वीकार्य पात्रों की अंतिम सूची को छोड़ देता है, इसलिए यह संभवतः हर किसी के लिए अलग हो सकता है।
ग्रेग हेवगिल

3
@GregHewgill यह मूर्खतापूर्ण होगा कि यह देखते हुए कि सब कुछ कितना कसकर निर्दिष्ट है। मुझे लगता है कि ये वास्तविक यूनिकोड चरित्र वर्ग हैं, जिन्हें यूनिकोड मानक में परिभाषित किया गया है (और कहां?)। isJavaIdentifierStart () में getType () का उल्लेख किया गया है, और मुद्रा प्रतीक और कनेक्टर विराम चिह्न दोनों प्रकार भी हैं जो उस फ़ंक्शन द्वारा वापस किए जा सकते हैं, इसलिए सूची वहां दी जा सकती है। "सामान्य श्रेणी" वास्तव में यूनिकोड मानक में एक विशिष्ट शब्द है। तो मान्य मान होगा L[सभी], Nl, Sc, Pc
रैंडम 832

3
@GregHewgill सही है। विनिर्देशन छोटा और स्पष्ट है, और इसे Character.isJavaIdentifierStart () और Character.isJavaIdentifierPart () द्वारा परिभाषित किया गया है। समाप्त। याद रखने वाली महत्वपूर्ण बात यह है कि यूनिकोड विकसित हो रहा है; समाप्त होने के रूप में चरित्र सेट के विचार के जाल में न पड़ें (लैटिन एक भयानक उदाहरण है; इसे अनदेखा करें)। हर समय वर्ण बनाए जाते हैं। अपने जापानी दोस्तों से पूछें। समय के साथ बदलने के लिए कानूनी जावा पहचानकर्ताओं की अपेक्षा करें - और यह जानबूझकर है। मुद्दा यह है कि लोगों को मानव भाषाओं में कोड लिखने दें। यह परिवर्तन की अनुमति के लिए एक कठिन आवश्यकता की ओर जाता है।
जेम्स मूर

6

यहाँ यूनिकोड में कनेक्टर वर्णों की सूची दी गई है । आप उन्हें अपने कीबोर्ड पर नहीं पाएंगे।

U + 005F कम लाइन _
U + 203F UNDERTIE ‿
U + 2040 वर्ण टाई ⁀
U + 2054 उल्टे UNDERTIE ⁔
U + FE33 प्रस्तुति फार्म के लिए VERTICAL कम लाइन _ U
+ FE34 प्रस्तुति फार्म के लिए VERTICAL लहराती कम लाइन ︴
U + FE4D धराशायी कम लाइन ﹍
U + FE4E CENTRELINE लो लाइन FE
U + FE4F लहरदार कम लाइन L
U + FF3F FULLWIDTH कम लाइन 4


5
मुझे नहीं पता कि आप किस कीबोर्ड लेआउट का उपयोग कर रहे हैं, लेकिन मैं निश्चित रूप से _ (U + 005F) आसानी से टाइप कर सकता हूं :)
bdonlan

4

दो पात्रों को जोड़ने के लिए एक कनेक्टिंग कैरेक्टर का उपयोग किया जाता है।

जावा में, एक कनेक्टिंग कैरेक्टर वह है जिसके लिए Character.getType (int codePoint) / Character.getType (char ch), Character.CONNECTOR_PUNCTUATION के बराबर मान देता है ।

ध्यान दें कि जावा में, चरित्र की जानकारी यूनिकोड मानक पर आधारित है जो पात्रों को जोड़ने के लिए उन्हें सामान्य श्रेणी 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

वैसे भी, एक तरफ विवरण, परीक्षा केवल मूल लैटिन वर्ण सेट पर केंद्रित है

इसके अलावा, जावा में कानूनी पहचानकर्ताओं के लिए, यहां युक्ति प्रदान की गई है । अधिक विवरण प्राप्त करने के लिए चरित्र वर्ग API का उपयोग करें।


1

जावा पहचानकर्ताओं (हालांकि शुरुआत में नहीं) में अनुमति दी जाने वाली सबसे अच्छी, अच्छी तरह से मजेदार चरित्रों में से एक है यूनिकोड चरित्र जिसका नाम "जीरो विथ नॉन जॉइनर" (& zwnj ;, U + 200C, https://en.wwipedia.org है ; / विकी / शून्य-चौड़ाई_ गन-जॉइनर )।

मैंने एक बार XML के एक टुकड़े में एक विशेषता मूल्य के अंदर उस XML के किसी अन्य टुकड़े के संदर्भ में पकड़ लिया था। चूंकि ZWNJ "शून्य चौड़ाई" है, इसे देखा नहीं जा सकता (सिवाय कर्सर के साथ चलने पर, इसे पहले वर्ण पर सही प्रदर्शित किया गया है)। यह लॉगफ़ाइल और / या कंसोल आउटपुट में भी नहीं देखा जा सकता है। लेकिन यह हर समय वहाँ था: खोज फ़ील्ड में कॉपी और पेस्ट मिला और इस प्रकार संदर्भित स्थिति नहीं मिली। खोज फ़ील्ड में स्ट्रिंग का (दृश्य भाग) टाइप करने पर, संदर्भित स्थिति मिली। यह पता लगाने के लिए मुझे कुछ समय लगा।

यूरोपीय कीबोर्ड लेआउट का उपयोग करते समय एक जीरो-चौड़ाई-गैर-योजक वास्तव में काफी आसान (बहुत आसान) है, कम से कम इसके जर्मन संस्करण में, जैसे "यूरोपास्टैस्टुरेट 2.02" - यह AltGr + "के साथ उपलब्ध है।" दुर्भाग्य से अधिकांश कीबोर्ड पर सीधे एक दूसरे के बगल में स्थित होते हैं और आसानी से गलती से एक साथ हिट हो सकते हैं।

जावा पर वापस: मैंने अच्छी तरह सोचा, आप इस तरह से कुछ कोड लिख सकते हैं:

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

दूसरे के साथ मैं शून्य-चौड़ाई-गैर-योजक द्वारा जोड़ा गया (ऐसा नहीं कर सकता है कि उपरोक्त कोड स्टैकओवरफ़्लो के संपादक में छीन लिया गया है), लेकिन यह काम नहीं किया। 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 बेल बना सकते हैं! या पात्रों का उपयोग करें जो केवल कभी-कभी प्रदर्शित किए जाएंगे, जैसे नरम हाइफ़न।


इसमें \ u007f, DEL वर्ण शामिल है। :-(
टोड ओ'ब्रायन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.