2014-05-24 8 views
5

मुझे पता है कि उपयोग करने के लिए एन्कोडिंग निर्दिष्ट किए बिना जावा में फ़ाइल लोड करना प्लेटफ़ॉर्म निर्भर है। लेकिन मेरा प्रश्न है .java स्रोत फाइलों में निहित पाठ: क्या उन फ़ाइलों के लिए एन्कोडिंग अभी भी प्रासंगिक है एक बार संकलित?जावा स्रोत फाइलें - संकलित होने पर अभी भी एन्कोडिंग प्रासंगिक है?

उदाहरण के लिए, अगर मैं जो Cp1252 एन्कोड किया गया है और शामिल है विंडोज पर एक test.java फ़ाइल है:

private String encodingTest = "Bœuf fûmé"; 

अगर मैं यह -encoding Cp1252 का उपयोग कर संकलन, क्या होता है वास्तव में जिसके परिणामस्वरूप .class में इस पाठ के लिए? क्या एन्कोडिंग अभी भी मायने रखती है? या संकलन करते समय जावा द्वारा मानकीकृत एन्कोडिंग है?

परिणामस्वरूप .class प्लेटफॉर्म पर निर्भर करेगा? यदि मैं विंडोज, लिनक्स, सोलारिस पर इस पाठ को आउटपुट करता हूं तो क्या मेरा एक अलग परिणाम हो सकता है? क्या सर्वर पर एन्कोडिंग कॉन्फ़िगरेशन इस पाठ को किसी अन्य तरीके से प्रस्तुत करने पर प्रभाव डाल सकता है?

+0

मुझे लगता है कि अगर परिणामी '.class' प्लेटफॉर्म पर निर्भर था, तो यह जावा के मुख्य विचारों में से एक को तोड़ देगा - एक बार लिखें, कहीं भी चलाएं। मैं * विश्वास करता हूं कि जावा में 'char' मान यूनिकोड में एन्कोड किए गए हैं, लेकिन जैसा कि मेरे पास कोई स्रोत नहीं है, मैं इसे उत्तर के रूप में पोस्ट नहीं करूंगा। मेरा अनुमान है कि '-कोडिंग' क्या करता है संकलक को बताता है कि स्रोत फ़ाइल एन्कोडिंग क्या है, इसलिए आप बाइटकोड में कुछ अलग हो सकते हैं, लेकिन बाइटकोड * किसी दिए गए चरित्र के लिए एक कैनोलिक प्रतिनिधित्व होना चाहिए। – awksp

उत्तर

2

स्रोत कोड एन्कोडिंग बहुत प्रासंगिक जबकि संकलन करते हुए, जैसा कि ओपी ने अपनी पोस्ट में कहा है। हालांकि संकलन के बाद, सभी शाब्दिक पाठ के रूप में (modified-) UTF-8 एन्कोडेड तार संग्रहित है।

सभी स्ट्रिंग शाब्दिक, वर्ग/विधि/फ़ील्ड का नाम और उन्हें संदर्भ में UTF-8 एन्कोडिंग .class फ़ाइल की लगातार पूल में जमा हो जाती:

From the JVM spec (for Java version 1.7):

4,4। 7। CONSTANT_Utf8_info संरचना

CONSTANT_Utf8_info संरचना स्थिर स्ट्रिंग मूल्यों का प्रतिनिधित्व करने के लिए प्रयोग किया जाता है:

[...]

स्ट्रिंग सामग्री संशोधित UTF-8 में एन्कोड किया गया है।संशोधित यूटीएफ -8 तारों को एन्कोड किया गया है ताकि कोड बिंदु अनुक्रम जिनमें केवल गैर-शून्य ASCII वर्ण शामिल हो, केवल 1 बाइट प्रति कोड बिंदु का उपयोग करके प्रदर्शित किया जा सकता है, लेकिन यूनिकोड कोडस्पेस में सभी कोड बिंदु प्रदर्शित हो सकते हैं।

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

सामान्य रूप से, अनुभाग 4.4 of the JVM specification बताता है कि निरंतर पूल कैसे काम करता है और स्ट्रिंग्स, कक्षा/फ़ील्ड/विधि नाम इत्यादि CONSTANT_Utf8_info संरचना द्वारा दर्शाए जाते हैं।

0

आंतरिक रूप से, जावा हमेशा स्ट्रिंग ऑब्जेक्ट्स में यूटीएफ -16 का उपयोग करते हैं, इसलिए यह स्रोत कोड में कभी भी एन्कोडिंग का "अनजान" होता है।

बस अपने आप से पुष्टि करने के लिए, String class के लिए स्रोत कोड पर एक नज़र डालें, एन्कोडिंग के बारे में जानकारी नहीं है।

0

जावा जानबूझकर बाइनरी डेटा (बाइट, इनपुट/आउटपुटस्ट्रीम) और पाठ (स्ट्रिंग, रीडर/राइटर) के बीच एक अंतर बनाता है जो यूनिकोड में है, इसलिए कोई भी किसी भी स्क्रिप्ट का उपयोग और संयोजन कर सकता है। इस प्रकार .class फ़ाइलों में पाठ स्थिरांक यूटीएफ -8 के रूप में होते हैं, और आंतरिक रूप से स्मृति में स्ट्रिंग और चार यूटीएफ -16 में होते हैं।

इस तरह जावा में वास्तव में स्पष्ट एन्कोडिंग अवगत भाषाओं, जहां यह नहीं तथ्य के लिए, कि एक जावा स्रोत, किसी भी एन्कोडिंग में हो सकता है मंच एन्कोडिंग के लिए दोषी है, और संकलन की जरूरत है एक ही दिए जाने की में से एक है एन्कोडिंग (या एक ही को डिफ़ॉल्ट)।

आजकल एक परियोजनाओं जहां स्रोत और संकलक के लिए एन्कोडिंग UTF-8 के रूप में निर्दिष्ट किया जाता है देखता है।

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