2012-04-28 9 views
13

कुछ कंपेलर JavaDoc और स्रोत कोड टिप्पणियों में गैर-ASCII वर्णों पर विफल रहे। जावा स्रोत फ़ाइलों में यूनिकोड के संबंध में वर्तमान (जावा 7) और भविष्य (जावा 8 और उससे परे) प्रथाओं क्या है? क्या IcedTea, OpenJDK, और अन्य जावा वातावरण के बीच अंतर हैं, और भाषा विनिर्देश को क्या निर्धारित किया गया है? क्या सभी गैर-ASCII वर्ण जावाडॉक में HTML से बचें और बचें;-जैसे कोड? लेकिन जावा // टिप्पणी समकक्ष क्या होगी?जावडोक और टिप्पणियों में यूनिकोड?

अद्यतन: टिप्पणियां इंगित करती हैं कि कोई भी चरित्र सेट का उपयोग कर सकता है, और किसी को संकलित करने पर यह इंगित करने की आवश्यकता है कि स्रोत फ़ाइल में कौन सा चार सेट उपयोग किया जाता है। मैं इसे देख लूंगा, और एंट, ग्रहण, और मेवेन के माध्यम से इसे कॉन्फ़िगर करने के तरीके के विवरणों की तलाश करूँगा।

+1

[इस] (http://en.wikibooks.org/wiki/Java_Programming/Syntax/Unicode_Source) पर एक नज़र डालें (मुझे यकीन है कि यह जेएलएस द्वारा निर्दिष्ट है)। –

+5

दरअसल, आप अपनी स्रोत फ़ाइलों में इच्छित किसी भी एन्कोडिंग का उपयोग कर सकते हैं, आपको बस यह इंगित करने की आवश्यकता है कि आपने जावा कंपाइलर और javadoc कमांड लाइन में कौन सा चुना है। –

+0

ठीक है, यह वह जानकारी है जिसे मैं ढूंढ रहा हूं! सबसे पहले, यह बहुत अच्छा है, और इस बारे में पता नहीं था। तो, अब मुझे यह समझने की जरूरत है कि कंपाइलर को यह जानने के लिए कि चार सेट का उपयोग कैसे किया जाए ... उदाहरण के लिए, सीडीके को एंटी, मेवेन और एक्लिप्स का उपयोग करके संकलित किया गया है ... –

उत्तर

12

कुछ compilers JavaDoc और स्रोत कोड टिप्पणी में गैर- ASCII वर्ण पर असफल रहा।

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


javac के लिए man पेज और javadoc कहना

-encoding name 
      Specifies the source file encoding name, such as 
      EUCJIS/SJIS. If this option is not specified, the plat- 
      form default converter is used. 

तो एन्कोडिंग आप अपने स्रोत फ़ाइलों के लिए उपयोग किया है के साथ <encoding-name> बदलने के बाद एन्कोडिंग झंडा

javadoc -encoding <encoding-name> ... 

साथ javadoc चल इसे सही एन्कोडिंग का उपयोग करना चाहिए।

यदि आपके पास स्रोत फ़ाइलों के समूह के भीतर उपयोग किए जाने वाले एक से अधिक एन्कोडिंग हैं जिन्हें आपको एक साथ संकलित करने की आवश्यकता है, तो आपको पहले इसे ठीक करने और सभी स्रोत फ़ाइलों के लिए एक वर्दी एन्कोडिंग पर व्यवस्थित करने की आवश्यकता है। आपको वास्तव में केवल यूटीएफ -8 का उपयोग करना चाहिए या ASCII से चिपकना चाहिए।


वर्तमान (जावा 7) और भविष्य (जावा 8 और आगे) प्रथाओं जावा स्रोत फ़ाइलों में यूनिकोड के संबंध में क्या है?

जावा में एक स्रोत फ़ाइल से निपटने के लिए एल्गोरिथ्म

  1. कलेक्ट बाइट्स
  2. वर्ण (UTF-16 कोड इकाइयों) कुछ एन्कोडिंग का उपयोग करने के लिए बाइट्स कन्वर्ट है।
  3. '\\''u' के सभी अनुक्रमों को बदलें, उसके बाद हेक्स-अंकों के अनुरूप कोड-इकाई के साथ चार हेक्स अंकों के साथ। अगर "\u" है तो चार हेक्स अंकों के बाद त्रुटि हो गई है।
  4. अक्षर को टोकन में लेक्स करें।
  5. कक्षाओं में टोकन पार्स करें।

वर्तमान और पूर्व अभ्यास कि चरण 2, UTF-16 कोड इकाइयों को बाइट्स परिवर्तित है, उपकरण है जो संकलन इकाई (स्रोत फ़ाइल), लेकिन कमांड लाइन इंटरफेस के लिए वास्तविक मानक लोड कर रहा है पर निर्भर है है -encoding ध्वज का उपयोग करने के लिए।

उस रूपांतरण के बाद, भाषा अनिवार्य है कि \uABCD शैली अनुक्रमों को लेक्सिंग और पार्सिंग से पहले यूटीएफ -16 कोड इकाइयों (चरण 3) में परिवर्तित कर दिया गया है।

उदाहरण के लिए:

int a; 
\u0061 = 42; 

जावा बयान के एक वैध जोड़ी है। किसी भी जावा स्रोत कोड उपकरण चाहिए, वर्ण, लेकिन पार्स करने से पहले बाइट्स परिवर्तित करने के बाद, \ uABCD दृश्यों के लिए लग रही है और उन्हें बदलने तो यह कोड को पार्स से पहले

int a; 
a = 42; 

में बदल जाती है। यह तब भी होता है जब \ uABCD अनुक्रम होता है। [105, 110, 116, 32, 97, 59, 10, 92, 117, 48, 48, 54, 49, 32, 61, 32, 52, 50, 59]

  • वर्ण में कनवर्ट बाइट्स: ['i', 'n', 't', ' ', 'a', ';', '\n', '\\', 'u', '0', '0', '6', '1', ' ', '=', ' ', '4', '2', ';']
  • यूनिकोड निकल जाता बदलें: ['i', 'n', 't', ' ', 'a', ';', '\n', a, ' ', '=', ' ', '4', '2', ';']
  • लेक्स:

    इस प्रक्रिया की तरह

    1. बाइट्स जाओ दिखता ["int", "a", ";", "a", "=", "42", ";"]
    2. पार्स: (Block (Variable (Type int) (Identifier "a")) (Assign (Reference "a") (Int 42)))

    सभी गैर- ASCII वर्ण HTML और भागने के साथ JavaDoc में भाग निकले किया जाना चाहिए, की तरह कोड?

    '<' जैसे HTML विशेष वर्णों को छोड़कर कोई आवश्यकता नहीं है जिसे आप दस्तावेज़ीकरण में सचमुच दिखाना चाहते हैं। आप javadoc टिप्पणियों के अंदर \uABCD अनुक्रमों का उपयोग कर सकते हैं। स्रोत फ़ाइल को पार्स करने से पहले जावा प्रक्रिया \u.... ताकि वे स्ट्रिंग्स, टिप्पणियों, कहीं भी वास्तव में दिखाई दे सकें।यही कारण है कि

    System.out.println("Hello, world!\u0022); 
    

    मान्य जावा कथन है।

    /** @return \u03b8 in radians */ 
    

    जहाँ तक जावाडोक संबंध है

    /** @return θ in radians */ 
    

    के बराबर है।


    लेकिन क्या जावा // टिप्पणी बराबर होगा?

    आप जावा में // टिप्पणियों का उपयोग कर सकते हैं लेकिन जावाडॉक केवल /**...*/ टिप्पणियों के लिए टिप्पणियों के अंदर दिखता है। // टिप्पणियां मेटाडेटा नहीं ले जा रही हैं। \uABCD दृश्यों के जावा से निपटने का

    एक उपशाखा है कि हालांकि

    // Comment text.\u000A System.out.println("Not really comment text"); 
    

    एकरेखीय टिपण्णी की तरह लग रहा है, और कई IDEs इस तरह के रूप में यह उजागर करेगा, यह नहीं है।

  • +0

    क्या जावा उपकरण सम्मान emacs/vim एन्कोडिंग के बारे में मेटाडेटा? – Marcin

    +0

    @ मार्सिन, यदि आपके पास फ़ाइल की शुरुआत में '// - * - कोडिंग: यूटीएफ -8 - * -' जैसी टिप्पणी है, तो एक उपकरण ऐसा करने का विकल्प चुन सकता है, लेकिन सूर्य उपकरण AFAIK नहीं है। –

    +0

    निराशाजनक, धन्यवाद। – Marcin

    4

    टिप्पणीकर्ताओं ने संकेत दिया कि स्रोत फ़ाइलों का एन्कोडिंग (कम से कम कुछ) कंपाइलर्स को पास किया जा सकता है। इस जवाब में, मैं सारांशित करूंगा कि इस जानकारी को कैसे पास किया जाए।

    ग्रहण

    ग्रहण (3.7 चेक) किसी विशेष विन्यास की आवश्यकता नहीं है, और आप खुशी से की तरह जावा स्रोत कोड का उपयोग कर सकते हैं:

    double π = Math.PI; 
    

    चींटी

    <javac encoding="UTF-8" ... > 
    </javac> 
    

    जावा

    javac -encoding UTF-8 src/main/Foo.java 
    
    संबंधित मुद्दे