2012-01-17 10 views
9

से पहले जोड़ा गया है मेरे पास एक क्लाइंट एप्लिकेशन है जो सर्वर से अनुरोध भेज रहा है। सर्वर डेटाबेस से फ़ील्ड ला रहा है और क्लाइंट को java.lang.String प्रतिक्रिया भेज रहा है। सर्वर जेबॉस v5.0 पर चल रहा है। असामान्य बात यह है कि, जब सर्वर विंडोज मशीन पर चल रहा है, क्लाइंट द्वारा प्राप्त प्रतिक्रिया सामान्य है लेकिन जब यह लिनक्स पर चल रही है तो एन्कोडिंग में कुछ समस्या है।एक विशेष चरित्र §

इस डेटाबेस में डेटा है: "INET§IMPNG\n"

प्रतिक्रिया सही ढंग से प्राप्त होता है जब सर्वर विंडोज पर चल रहा है।

सर्वर विशेष रूप से § से पहले जोड़ा गया है जब सर्वर लिनक्स पर चल रहा है। क्या सर्वर की ओर से मुझे कोई विशेष चीज़ करने की ज़रूरत है। किसी भी सहायता की सराहना की जाएगी।

संपादित करें:

प्राप्त प्रतिक्रिया है: INET§IMPNG

+0

जो जोड़ा गया है पोस्ट करें? –

+0

मैंने प्रश्न संपादित किया है .. – HashimR

उत्तर

9

यह लगभग निश्चित रूप से एक वर्ण एन्कोडिंग समस्या है। क्लाइंट और सर्वर के बीच विसंगतियों से बचने के लिए, हमेशा एक विशिष्ट एन्कोडिंग निर्दिष्ट करें और डिफ़ॉल्ट एन्कोडिंग से बचें। (तो, उदाहरण के लिए, "xyz".getBytes() के बजाय, "xyz".getBytes("UTF-8")

+0

क्या मुझे प्रतिक्रिया सामग्री प्रकार भी सेट करने की आवश्यकता है? – HashimR

+0

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

+0

तो मुझे आपकी उपर्युक्त टिप्पणी से क्या मिलता है यह है कि सामग्री प्रकार को सेट नहीं किया जाना चाहिए क्योंकि यह प्रोग्राम की स्केलेबिलिटी को प्रभावित करेगा। केवल 'xyz "का उपयोग कर .getBytes (" UTF-8 ")' अभी के लिए पर्याप्त है। क्या इसे मैंने ठीक तरह से लिया? :) – HashimR

2

का उपयोग त्रुटि आप यहाँ देख रहे हैं क्योंकि लिनक्स सर्वर डिफ़ॉल्ट रूप से UTF-8 के रूप में स्ट्रिंग भेजने के लिए है। UTF-8 में, नियमित ASCII वर्ण एकल के रूप में इनकोड बाइट। § चरित्र दो बाइट्स के रूप में एन्कोड किया गया है। आप इस का उपयोग कर सी.पी.-1252 डिकोड हैं, तो आप § देखेंगे क्योंकि दो बाइट्स दो अलग-अलग पात्रों के रूप में व्याख्या कर रहे हैं।

विंडोज़ सर्वर, http://en.wikipedia.org/wiki/Windows-1252 का उपयोग करेगा जो सांकेतिक शब्दों में बदलना कर सकते हैं § एक बाइट के रूप में।

यदि आप अपने प्रोटोकॉल का उपयोग कर रहे हैं, तो आपको तार पर उपयोग करने के लिए कौन सा वर्ण एन्कोडिंग निर्दिष्ट करना चाहिए। मेरा सुझाव है कि आप def यूटीएफ -8 (इंटरनेट मानक) के लिए उत्साहित। स्ट्रिंग भेजते समय, आपको "xyz".getBytes("UTF-8") का उपयोग करना चाहिए। यदि आपको स्ट्रिंग प्राप्त होती है, तो आपको new String(bytes, "UTF-8") का उपयोग करना चाहिए।

यदि आप HTTP का उपयोग कर रहे हैं, तो आपके क्लाइंट को HTTP spec की धारा 14 में शीर्षलेखों का सम्मान करना चाहिए। मैं प्रस्तावित करता हूं कि आप एक लागू HTTP क्लाइंट जैसे अपाचे कॉमन्स HTTP क्लाइंट या अंतर्निहित जे 2 एसई का उपयोग करें। सर्वर-साइड पर, आपको एक लेखक प्राप्त करने के लिए सर्वलेट में response.getWriter() विधि का उपयोग करना चाहिए जो स्वचालित रूप से सहमत एन्कोडिंग का उपयोग करेगा। कृपया ध्यान दें कि आप केवल बाइट आउटपुट नहीं कर सकते हैं, क्योंकि सर्वर और क्लाइंट HTTP स्ट्रीम के लिए किसी अन्य स्थानांतरण-एन्कोडिंग पर सहमत हो सकता है!

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

  • कोई संबंधित समस्या नहीं^_^