2014-05-15 6 views
9

मैं अपने यूनिकोड नाम का उपयोग कर जावा में एक वर्ण या int कोडपॉइंट कैसे देखूं?जावा में अपने (यूनिकोड) नाम से चरित्र कैसे प्राप्त करें?

उदाहरण के लिए, यदि

Character.getName('\u00e4') 

रिटर्न "LATIN SMALL LETTER A WITH DIAERESIS", मैं कैसे रिवर्स आपरेशन करते हैं का उपयोग कर "सादे" जावा (अर्थात '\u00e4' को "LATIN SMALL LETTER A WITH DIAERESIS" से जाना)?

संपादित करें:, सवाल है

"\N{LATIN SMALL LETTER A WITH DIAERESIS}" # this gives me what I want as a literal 

unicodedata.lookup("LATIN SMALL LETTER A WITH DIAERESIS") # a dynamic version 

अब: में भी ऐसा ही करने की टिप्पणियां जो मैं चाहता की धार को रोकने के लिए या मैं नहीं करना चाहते, यहाँ मैं अजगर में क्या करेंगे है जावा।

और, बीटीडब्ल्यू, मैं "यूनिकोड एस्केप प्रिंट नहीं करना चाहता" - वास्तव में चार के लिए हेक्स प्राप्त करना आसान है, लेकिन मुझे एक चार असर वाला नाम चाहिए।

इसे दूसरे शब्दों में रखने के लिए मैं Character.getName(int) क्या करता हूं इसके विपरीत करना चाहता हूं।

+0

संभवतः एक डुप्लिकेट [एक चरित्र (या इसकी प्रकार की श्रेणी) का यूनिकोड नाम कैसे प्राप्त करें?] (Http://stackoverflow.com/questions/2443325/java-how-to-get-unicode-name-of -ए-कैरेक्टर-या-इसके-टाइप-श्रेणी) – Jonathan

+1

@ जोनाथन ओपी – awksp

+0

उपयोगकर्ता 3580294 के आसपास दूसरी तरफ जाना चाहता है कि आप कैसे समझा सकते हैं? –

उत्तर

5

ICU4J लाइब्रेरी यहां आपकी सहायता कर सकती है। इसमें UCharactergetCharFromName और अन्य संबंधित विधियों के साथ एक वर्ग है जो विभिन्न प्रकार के चरित्र नाम तारों से int कोड बिंदुओं पर प्रदर्शित हो सकता है।

हालांकि, यदि आप हार्ड कोड किए गए चरित्र नामों (यानी स्रोत कोड में उद्धृत स्ट्रिंग अक्षर) के साथ काम कर रहे हैं तो यह एक बार अनुवाद करने के लिए और अधिक कुशल होगा - स्रोत कोड में \u से बचें और एक टिप्पणी जोड़ें यदि आवश्यक हो तो पूर्ण नाम के साथ - हर बार रनटाइम पर नाम तालिकाओं को पार्स करने की लागत लगाना। यदि चरित्र नाम किसी फ़ाइल या समान पढ़ने से आ रहे हैं तो स्पष्ट रूप से आपको रनटाइम पर कनवर्ट करना होगा।

+0

धन्यवाद। मुझे पता है कि आईसीयू 4 जे सभी यूनिकोड सिरदर्द का जवाब है, लेकिन मुझे "सादे" जावा (प्रश्न में) चाहिए। –

+2

@PiotrFindeisen ने अन्य उत्तरों के रूप में प्रदर्शन किया है, यदि आप किसी तृतीय पक्ष लाइब्रेरी का उपयोग नहीं करना चाहते हैं तो आपको मूल रूप से उसी एल्गोरिदम के सेट को लागू करना होगा। एक मौजूदा (व्यापक रूप से उपयोग और परीक्षण) ओपन सोर्स लाइब्रेरी का उपयोग करने से आपके स्वयं के काम को पहले से ही कर चुके हैं, जो आपके पहले से ही "सादा जावा" को फिर से कार्यान्वित करता है? –

+0

अंतर है - निर्भरता। यह एक ऑपरेशन इतना बुनियादी है कि मैं लगातार आश्चर्यचकित हूं कि कोई सादा "सादा जावा" उत्तर नहीं है - खासकर जब से पाइथन के पास यह तब से है? आज मैं बिल्कुल यही करता हूं: 'kcharselect'' से बचने के लिए और टिप्पणी में नाम लिखें। लेकिन यह सब: समय बर्बाद, त्रुटि प्रवण और खतरनाक नकल। –

0

खैर, Character.class के लिए स्रोत कोड देख:

public static String getName(int codePoint) { 
    if (!isValidCodePoint(codePoint)) { 
     throw new IllegalArgumentException(); 
    } 
    String name = CharacterName.get(codePoint); 
    if (name != null) 
     return name; 
    ... 
} 

CharacterName एक पैकेज-निजी वर्ग जो lazily चरित्र के नाम (मुझे लगता है कि) के एक SoftReference<byte[]> पूल initializes है। विशेष रूप से एक लाइन है, हालांकि ब्याज की है विभिन्न इनपुट धारा कंस्ट्रक्टर्स की एक श्रृंखला में दफन था:

private static synchronized byte[] initNamePool() { 
    ... 
     return getClass().getResourceAsStream("uniName.dat"); 
    ... 
} 

अब, मैं कुछ खुदाई कर रहा हूँ, और किसी कारण से इस uniName.dat में मौजूद प्रतीत नहीं होता है ओपनजेडीके का स्रोत मुझे uniName.dat मिला - मेरे टीएक्स लाइव वितरण के हिस्से के रूप में, आश्चर्यजनक रूप से पर्याप्त। हेक्स संपादक में इसे खोलने से बाइट्स के जंबल्स सामने आते हैं - इसलिए सामग्री किसी भी तरह एन्कोड की जाती है। कैसे, मेरे पास कोई सुराग नहीं है। मैं स्रोत कोड पर एक दूसरा रूप लेगा, लेकिन इसे डीकोड करने में कुछ समय लग सकता है, अगर मैं इसे बिल्कुल समझ सकता हूं।

इसके अतिरिक्त, ग्रहण की मेरी प्रतिलिपि में डीबगर टूटा हुआ प्रतीत होता है (किसी कारण या किसी अन्य कारण के लिए चर हल नहीं कर सकता), इसलिए मैं यह देखने के लिए इनपुट स्ट्रीम का निरीक्षण नहीं कर सकता कि यह कहां से पढ़ रहा है।

संक्षेप में

तो, जब तक आप कॉपी-पेस्ट की तरह CharacterName, या अपने स्वयं कोड कि इस फाइल निकालता है रोलिंग से नाम पूल कोड लगता है कि आप निवासी जावा में ऐसा कर सकते हैं नहीं लगता है (यदि आप इसे पा सकते हैं यह सोचते हैं)


संपादित करें: uniName.dat मिला! जावा मशीन में resources.jar में स्थित मेरी मशीन पर। अभी भी बाइट्स का एक गुच्छा। तो आप या तो इस फ़ाइल को स्वयं पार्स कर सकते हैं (बहुत मज़ा नहीं, इसमें बहुत कुछ झुकाव शामिल है), या लाइब्रेरी का उपयोग करें (ऊपर सुझाया गया है)। इसलिए यदि आप मूल जावा तक सीमित हैं, तो आप CharacterName कक्षा पर एक नज़र डालना चाहेंगे और देखें कि क्या आप HashMap<String, Character> में कुछ प्राप्त कर सकते हैं या नहीं।

संबंधित मुद्दे

 संबंधित मुद्दे