2010-02-10 14 views
6

जावा 6 का उपयोग करते हुए एक स्ट्रिंग से 8 बिट वर्ण प्राप्त करने के लिए:String.getBytes ("ISO-8859-1") मेरे ओएस पर 16-बिट वर्ण देता एक्स

System.out.println(Arrays.toString("öä".getBytes("ISO-8859-1"))); 

मुझे देता है, लिनक्स पर: [-10, 28] लेकिन ओएस इलेवन प्राप्त करते हैं: [63, 63, 63, -89]

मुझे फैंसी न्यू एनओ चारसेट एन्कोडर क्लास का उपयोग करते समय एक ही परिणाम मिलते हैं। मैं क्या गलत कर रहा हूं? या यह ऐप्पल की गलती है? :)

उत्तर

4

मैं UTF-8 के रूप में स्रोत फ़ाइल बचत, तो संकलक यह वास्तव में MacRoman था बताकर इस समस्या को पुन: पेश करने में कामयाब रहे:

javac -encoding MacRoman Test.java

मैं javac के UTF-8 के लिए डिफ़ॉल्ट होगा सोचा होगा ओएसएक्स, लेकिन शायद नहीं। या हो सकता है कि आप एक आईडीई और का उपयोग कर रहे हैं, यह MacRoman को डिफॉल्ट कर रहा है। जो भी मामला है, आपको इसके बजाय यूटीएफ -8 का उपयोग करना होगा।

+0

ऐसा लगता है कि मैकरोमन मेरे ओएसएक्स सिस्टम पर डिफ़ॉल्ट एन्कोडिंग है। इस शाब्दिक के साथ स्रोत फ़ाइल यूटीएफ -8 में एन्कोड की गई है और यह गलत तरीके से मैकरोमन के रूप में इसे पार करती है। तो इसे कैसे ठीक करें? निर्दिष्ट करना -एनकोडिंग यूटीएफ -8 एक अच्छा विकल्प की तरह प्रतीत नहीं होता है। अगर मेरे पास कुछ अच्छी पुरानी आईएसओ -885 9 -1 फाइलें हैं तो क्या होगा? – lennartcl

+0

यदि आपकी कुछ फ़ाइलें आईएसओ -885 9 -1 हैं, तो आपको उन्हें अलग से संकलित करना होगा और * * * एन्कोडिंग निर्दिष्ट करना होगा। मेरा सुझाव है कि आप हमेशा बचत और संकलन के लिए यूटीएफ -8 निर्दिष्ट करें। यदि मैकरोमन या आईएसओ -885 9 -1 फ़ाइल में घुसपैठ हो जाती है, तो संकलन विफल होने पर आपको इसके बारे में पता चल जाएगा; यूटीएफ -8 को अन्य अन्य एन्कोडिंग की तुलना में फर्जी डेटा स्वीकार करने में बहुत मुश्किल है। –

+0

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

1

शायद स्रोत के लिए सेट सेट सेट नहीं है (और इस प्रकार सिस्टम लोकेल के अनुसार अलग है)?

क्या आप दोनों प्रणालियों पर एक ही संकलित कक्षा चला सकते हैं (फिर से संकलित नहीं)?

+0

यह निश्चित रूप से मामला है। वह कोड, सही ढंग से संकलित, सभी समर्थित प्लेटफार्मों पर एक ही आउटपुट का उत्पादन करेगा। –

2

स्रोत फ़ाइल का एन्कोडिंग क्या है? 63? के लिए कोड है जिसका अर्थ है "वर्ण निर्दिष्ट एन्कोडिंग में परिवर्तित नहीं किया जा सकता"।

तो मेरा अनुमान है कि आपने स्रोत फ़ाइल को मैक में कॉपी किया है और स्रोत फ़ाइल एक एन्कोडिंग का उपयोग करती है जो मैक जावा कंपाइलर की अपेक्षा नहीं करता है। आईआईआरसी, ओएस एक्स फाइल को यूटीएफ -8 होने की उम्मीद करेगा।

0

ध्यान रखें कि वर्णों का प्रतिनिधित्व करने के एक से अधिक तरीके हैं। मैक ओएस एक्स डिफ़ॉल्ट रूप से यूनिकोड का उपयोग करता है, इसलिए आपकी स्ट्रिंग शाब्दिक वास्तव में दो बाइट्स द्वारा प्रदर्शित नहीं की जा सकती है। आपको यह सुनिश्चित करने की ज़रूरत है कि आप उचित आने वाले चरित्र सेट से स्ट्रिंग लोड करें; उदाहरण के लिए, स्रोत में निर्दिष्ट करके आप एक चरित्र से बचें।

+0

इसके लायक होने के लिए, एक उच्चारण चरित्र को दो तरीकों से प्रदर्शित किया जा सकता है; एक सिंगल ग्लाइफ (ö) या संयोजन संयोजन के रूप में (\ u0308 o)। – AlBlue

+0

ठीक है, इस मामले में जावा फ़ाइल जेनरेट कोड है। शाब्दिक में इन पात्रों को एन्कोड किए जाने के तरीके को बदलना संभव नहीं है। – lennartcl

2

आपकी स्रोत फ़ाइल वर्णों को जोड़कर "öä" उत्पन्न कर रही है। इस पर

देखो:

System.out.println(Arrays.toString("\u00F6\u00E4".getBytes("ISO-8859-1"))) 

यह प्रिंट करेगा [-10, -28] की तरह आप उम्मीद कर (मैं इसे इस तरह से मुद्रित करने के लिए पसंद नहीं है लेकिन मैं जानता हूँ कि यह अपने प्रश्न की बात नहीं है) , क्योंकि वहां यूनिकोड कोडपॉइंट निर्दिष्ट किए गए हैं, पत्थर में नक्काशीदार हैं, और आपके टेक्स्ट एडिटर को 'ओ' और 'ए' को डायक्रिटिक संकेतों के साथ जोड़कर "स्मार्ट प्ले" करने की अनुमति नहीं है।

आमतौर पर, जब आपको ऐसी समस्याएं आती हैं तो संभवतः आप दो ओएस एक्स अन * एक्स कमांड का उपयोग करना चाहते हैं ताकि यह पता चल सके कि हुड के नीचे क्या हो रहा है: file और hexdump ऐसे मामलों में बहुत सुविधाजनक हैं।

आप उन्हें अपनी स्रोत फ़ाइल पर चलाने के लिए चाहते हैं और आप उन्हें अपनी कक्षा फ़ाइल पर चलाने के लिए चाहते हैं।

+0

उपयोगी छोटे उपकरण। तो जावैक कैसे नहीं जानता कि यह एक यूटीएफ -8 फाइल है? – lennartcl