2011-02-07 14 views
8

यह स्टैक ओवरफ़्लो के लिए मेरी पहली पोस्ट है। मैं 1 99 8 से जावा कर रहा हूं, इसलिए मैं कोई शुरुआत नहीं कर रहा हूं। हाल ही में मुझे एक फ़ाइल वर्ण एन्कोडिंग समस्या का सामना करना पड़ा जो मुझे कभी सामना नहीं कर रहा है। पाठ फ़ाइलों के चरित्र एन्कोडिंग के बारे में जागरूक होना और सामान्य प्लेटफ़ॉर्म पर चलने पर कोड लिखने के लिए यह सामान्य बात है। लेकिन मुझे मिली समस्या संकलन निष्पादन मंच से एक अलग मंच पर हुई थी। यह पूरी तरह से अप्रत्याशित था, क्योंकि मेरे अनुभव में जब जावैक कक्षा फ़ाइल बनाता है, महत्वपूर्ण पैरामीटर जावा स्रोत और लक्ष्य पैरा हैं, और जेडीके का संकलन संकलन कर रहा है। मैक ओएस एक्स पर चलाए जाने पर, मैक ओएस एक्स पर जेडके 1.6.0_22 के साथ संकलित कक्षाओं में 1.6.0_23-बी05 के साथ संकलित कक्षाओं से अलग वर्गों से अलग व्यवहार किया गया है। निर्दिष्ट स्रोत और लक्ष्य 1.4 थे।जावा कंपाइलर प्लेटफ़ॉर्म फ़ाइल एन्कोडिंग समस्या

एक स्ट्रिंग है स्मृति में आईएसओ 8859_1 के रूप में एन्कोड किया गया था एक PrintStream println विधि का उपयोग कर डिस्क के लिए लिखा गया था। जावा कोड को किस प्लेटफॉर्म पर संकलित किया गया था, इस आधार पर स्ट्रिंग को अलग-अलग लिखा गया था। यह एक बग का कारण बनता है। बग के लिए फिक्स फ़ाइल लिखने और पढ़ने के दौरान फ़ाइल एन्कोडिंग को स्पष्ट रूप से निर्दिष्ट करना था।

मुझे आश्चर्य हुआ कि व्यवहार कहां से संकलित किया गया था, इस पर निर्भर करता है कि वर्ग किस वर्ग पर चलाया गया था। मैं अलग-अलग प्लेटफॉर्म पर चलने पर जावा कोड से अलग व्यवहार कर रहा हूं। लेकिन यह थोड़ा डरावना है जब एक ही कोड, विभिन्न प्लेटफार्मों पर संकलित, एक ही मंच पर पर अलग-अलग चलता है।

क्या किसी को इस विशिष्ट समस्या का सामना करना पड़ा है? ऐसा लगता है कि किसी भी जावा कोड के लिए बीमार होना प्रतीत होता है जो अक्षर एन्कोडिंग को स्पष्ट रूप से निर्दिष्ट किए बिना फ़ाइल को स्ट्रिंग्स को पढ़ता है और लिखता है। और यह कितनी बार किया जाता है?

धन्यवाद,

रिचर्ड ब्रूस्टर http://rabbitsoftware.com

+0

समस्याग्रस्त फ़ाइल utf-8 के रूप में एन्कोड किया गया था? स्रोत में समस्याग्रस्त वर्ण थे, या केवल वर्णों के लिए अक्षर ** ** केवल उस विशेष मशीन पर संकलन के बाद थे? –

+0

क्या यह स्थिर फाइनल (कक्षा में स्ट्रिंग्स फाइनल फाइनल "बेक्स" स्ट्रिंग का उपयोग करके कक्षाओं में संकलित किया गया था)? या जब आप डिस्क पर लिखे गए हैं तो क्या आप डेटा को क्रमबद्ध कर रहे हैं? एक वर्ग उदाहरण serializing? सीरियलाइजेशन विधि डिफ़ॉल्ट (यानी संकलन मंच) एन्कोडिंग के साथ संकलित किया जा रहा है? –

+0

@ स्टेव बी .: वास्तव में, सभी स्ट्रिंग अक्षर और अन्य संकलन-समय निरंतर तार कक्षा में "बेकन" होते हैं, न केवल स्थिर अंतिम वाले। –

उत्तर

4

मैं एक अनुमान वहाँ संकलन चरण के दौरान एक ट्रांसकोडिंग मुद्दा है और संकलक एक स्रोत फ़ाइल की एन्कोडिंग के रूप में दिशा का अभाव है कि खतरा था (जैसे देखना जावैक -encoding स्विच)।

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

मैं इस here के बारे में थोड़ा लिखा है।

7

वहाँ एक एक स्ट्रिंग है कि स्मृति में ISO-8859-1 के रूप में एन्कोड किया गया था की तरह ऐसी कोई बातें हैं। मेमोरी में जावा स्ट्रिंग्स हमेशा यूनिकोड तार होते हैं। (यूटीएफ -16 में एनकोडेड, लेकिन आपको वास्तव में अब इसकी आवश्यकता नहीं है)।

जब आप इनपुट या आउटपुट स्ट्रिंग एन्कोडिंग केवल खेलने में आता है - तो, ​​कोई स्पष्ट एन्कोडिंग दिया, यह सिस्टम डिफ़ॉल्ट (जो कुछ सिस्टम पर उपयोगकर्ता सेटिंग्स पर निर्भर करता है) का उपयोग करता है।

मैकडॉवेल द्वारा कहा गया है कि, आपकी स्रोत फ़ाइल के वास्तविक एन्कोडिंग को एन्कोडिंग द्वारा मेल किया जाना चाहिए जो आपका कंपाइलर आपकी स्रोत फ़ाइल के बारे में मानता है, अन्यथा आपको देखी गई समस्याएं मिलती हैं।आप कई तरह से इस लक्ष्य को हासिल कर सकते हैं:

  • संकलक की -encoding विकल्प का उपयोग करें, अपने स्रोत फ़ाइल की एन्कोडिंग दे रही है। (चींटी के साथ, आप encoding= पैरामीटर सेट करते हैं।)
  • अपनी फ़ाइल के एन्कोडिंग को संकलक डिफ़ॉल्ट में बदलने के लिए अपने संपादक या किसी अन्य टूल (जैसे recode) का उपयोग करें।
  • native2ascii (दाएं -encoding विकल्प के साथ) अपनी स्रोत फ़ाइल को \uXXXX -escapes के साथ ASCII में अनुवाद करने के लिए उपयोग करें।

अंतिम मामले में, आप बाद में प्रत्येक फ़ाइल को प्रत्येक डिफ़ॉल्ट एन्कोडिंग के साथ संकलित कर सकते हैं, इसलिए यदि आप एन्कोडिंग-अनजान व्यक्तियों को कहीं भी संकलित करने के लिए स्रोत कोड देते हैं तो यह तरीका हो सकता है।

यदि आपके पास एक से अधिक फाइलों वाली एक बड़ी परियोजना है, तो उनके पास एक ही एन्कोडिंग होनी चाहिए, क्योंकि कंपाइलर में केवल एक ऐसा स्विच है, कई नहीं।

मेरे द्वारा पिछले वर्षों में सभी परियोजनाओं में, मैं हमेशा अपनी सभी फाइलों को यूटीएफ -8 में एन्कोड करता हूं, और मेरी चींटी बिल्डफाइल में encoding="utf-8" पैरामीटर को जावैक कार्य में सेट करता है। (मेरा संपादक एन्कोडिंग को स्वचालित रूप से पहचानने के लिए काफी स्मार्ट है, लेकिन मैंने डिफॉल्ट को यूटीएफ -8 पर सेट किया है।)

एन्कोडिंग अन्य स्रोत-कोड हैंडलिंग टूल के लिए जवाडोक की तरह मायने रखती है। (वहाँ आपको चाहिए अतिरिक्त उत्पादन के लिए -charset और -docencoding विकल्प -। वे मैच चाहिए, लेकिन स्रोत -encoding के लिए अलग अलग हो सकता है)

+0

इसे स्रोत एन्कोडिंग के साथ नहीं करना है। कोई स्ट्रिंग अक्षर शामिल नहीं हैं। एक नेटवर्क कनेक्शन से एक स्ट्रिंग पढ़ी जाती है और फिर फ़ाइल में लिखी जाती है। मेरा मतलब है कि 'आईएसओ -885 9 -1' के रूप में स्मृति में एन्कोड किया गया है कि इनपुट स्ट्रीम उस चरित्र सेट का उपयोग करके पढ़ा जाता है, क्योंकि इस तरह यह एन्कोड किया गया है। –

+0

"कोई स्पष्ट एन्कोडिंग नहीं दिया गया है, यह सिस्टम डिफ़ॉल्ट का उपयोग करता है" हां, लेकिन रनटाइम वीएम का सिस्टम डिफ़ॉल्ट, है ना? इस मामले में एन्कोडिंग को संकलित मंच द्वारा स्पष्ट रूप से निर्धारित किया गया था। संकलन प्लेटफॉर्म के आधार पर एक प्रिंटस्ट्रीम अलग-अलग व्यवहार करता है। यह पोर्टेबल व्यवहार नहीं है। क्या आप अभी तक मेरा मुद्दा देखते हैं? –

+0

मुझे लगता है कि हमें आपके कोड के लिए एक न्यूनतम उदाहरण की आवश्यकता है। ऐसा लगता है कि दो प्रणालियों पर दो कंपाइलर्स अलग-अलग तरीकों का चयन करते हैं। –

1

मैं जब चर के नामों ascii नहीं हैं का उपयोग कर इसी तरह के मुद्दों लिया है (Σ , σ, Δ, आदि) गणित सूत्र करते समय। लिनक्स पर, यह व्याख्या करते समय यूटीएफ -8 एन्कोडिंग का उपयोग करता था। विंडोज़ पर यह अवैध नामों के बारे में शिकायत करता है क्योंकि विंडोज आईएसओ-लैटिन -1 का उपयोग करता है। समाधान उन फ़ाइलों को संकलित करने के लिए उपयोग की जाने वाली चींटी स्क्रिप्ट में एन्कोडिंग निर्दिष्ट करना था।

+0

अच्छा, मुझे लगता है कि आम तौर पर लोग सही सिरी अक्षरों का उपयोग करने के बजाय 'सिग्मा' (या 'sum'), 'सिग्मा', 'डेल्टा' लिखते हैं। मैंने एक बार 'ℕ' नामक एक चर बनाया। मैं इसे 'ℕ₀' कहना चाहता था, लेकिन जावैक ने इसे स्वीकार नहीं किया, क्योंकि' ₀' जावा के लिए एक अंक नहीं है। –

+0

@ पालो एबरमान मेरे पास यह मुद्दा था कि इतने सारे चर थे और समीकरण जटिल थे कि दस्तावेज एक पिटा था। मैंने विशेष पात्रों का उपयोग किया और दस्तावेज़ीकरण/शुद्धता का प्रमाण "देखें: स्कॉलनिक, पीपी XXX-XXX"। तथ्य यह है कि परिवर्तनीय पाठ के समान थे, जिससे दूसरों को समझना बहुत आसान हो गया। – KitsuneYMG

0

हमेशा अपनी स्रोत फ़ाइलों में बचने के कोड (उदा। \uxxxx) का उपयोग करें और यह कोई समस्या नहीं होगी। @ पाउलो ने इसका उल्लेख किया, लेकिन मैं इसे स्पष्ट रूप से कॉल करना चाहता था।

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