2010-10-29 13 views
7

में कनवर्ट करने के लिए मैं एक यूटीएफ 8 स्ट्रिंग को जावा यूनिकोड स्ट्रिंग में कनवर्ट करने का प्रयास करता हूं।UTF8 को यूनिकोड

String question = request.getParameter("searchWord"); 
byte[] bytes = question.getBytes(); 
question = new String(bytes, "UTF-8"); 

इनपुट चीनी वर्ण हैं और जब मैं प्रत्येक caracter की हेक्स कोड की तुलना में यह एक ही Chinses चरित्र है। तो मुझे पूरा यकीन है कि वर्णमाला यूटीएफ 8 है।

मैं गलत कहां जाऊं?

उत्तर

11

एक "UTF-8 स्ट्रिंग" जावा में जैसी कोई चीज नहीं है। सब कुछ यूनिकोड में है।

जब आप कोई एन्कोडिंग निर्दिष्ट किए बिना String.getBytes() कहते हैं, कि मंच डिफ़ॉल्ट एन्कोडिंग का उपयोग करता है - कि लगभग हमेशा एक बुरा विचार है।

आपको कुछ करने की यहाँ सही पात्रों को पाने के लिए नहीं करना चाहिए था - अनुरोध यह सब आप के लिए से निपटने की जानी चाहिए। यदि ऐसा नहीं कर रहा है, तो संभावना है कि यह पहले से ही खो गया डेटा है।

क्या आप वास्तव में गलत क्या हो रहा है इसका एक उदाहरण दे सकते हैं? आपको प्राप्त होने वाली स्ट्रिंग में वर्ण के यूनिकोड मान निर्दिष्ट करें (उदा। toCharArray() का उपयोग करके और फिर प्रत्येक char को int पर परिवर्तित करें) और जो आपको प्राप्त होने की उम्मीद है।

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

public static void dumpString(String text) { 
    for (int i = 0; i < text.length(); i++) { 
     System.out.println(i + ": " + (int) text.charAt(i)); 
    } 
} 

ध्यान दें कि कि दशमलव प्रत्येक यूनिकोड वर्ण का मूल्य दे देंगे: इस का निदान करने के लिए, कुछ इस तरह का उपयोग करें। यदि आपके पास एक आसान हेक्स लाइब्रेरी विधि है, तो आप इसका उपयोग हेक्स मान देने के लिए कर सकते हैं। मुख्य बिंदु यह है कि यह स्ट्रिंग में यूनिकोड वर्णों को डंप करेगा।

+0

उदाहरण के लिए इस चरित्र 告 मैं 229 145 138 इस दशमलव प्रतिनिधित्व whichis http://www.ansell-uebersetzungen.com/gbuni.html के अनुसार को सही पाने परिवर्तित किया जा करने की जरूरत है क्योंकि यह इस हेक्स प्रतिनिधित्व है: E5 91 8 ए तो अब मुझे इसे यूनिकोड में परिवर्तित करने की आवश्यकता है। I –

+0

तो मेरी राय में अनुरोध सही वर्ण भेजता है लेकिन मैं इसे जावा में नहीं पढ़ सकता, इसे यूनिकोड –

+0

@Rob में परिवर्तित करने की आवश्यकता है: नहीं, यह स्ट्रिंग में यू + 544 ए के रूप में दिखाई देना चाहिए। आपके द्वारा उद्धृत हेक्स प्रस्तुति यूटीएफ -8 प्रतिनिधित्व है - जो कभी भी स्ट्रिंग में क्या नहीं होने वाला है। आप कहते हैं कि आप "22" 145 138 प्राप्त करते हैं - जब आप क्या करते हैं? मैं कुछ निदान कोड के साथ अपना जवाब संपादित करूंगा। –

2

सबसे पहले यह सुनिश्चित करें कि डेटा वास्तव में UTF-8 के रूप में एन्कोड किया गया है।

जब HTML प्रपत्र डेटा भेजने प्रयुक्त एन्कोडिंग के बारे में ब्राउज़रों के बीच कुछ असंगति रहे हैं। वेब फॉर्म से यूटीएफ -8 एन्कोडेड डेटा भेजने का सबसे सुरक्षित तरीका यह है कि उस फॉर्म को उस पृष्ठ पर रखना है जो Content-Type: text/html; charset=utf-8 शीर्षलेख के साथ परोसा जाता है या इसमें <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> मेटा टैग होता है।


अब ठीक से request.getParameter() करने के लिए पहली कॉल करने से पहले अपने सर्वलेट में डेटा कॉल request.setCharacterEncoding("UTF-8") डिकोड करने के लिए।

सर्वलेट कंटेनर आपके लिए एन्कोडिंग का ख्याल रखता है। यदि आप setCharacterEncoding() का उपयोग ठीक से करते हैं तो आप सामान्य जावा स्ट्रिंग्स लौटने के लिए getParameter() की अपेक्षा कर सकते हैं।

+0

वर्णमाला एचटीएमएल में सही है। –

+0

अब जब मैं परिवर्तित करता हूं तो मुझे प्रत्येक चरित्र के लिए यूनिकोड 63 का प्रतिनिधित्व मिलता है तो मुझे लगता है कि मेरा रूपांतरण अभी भी गलत है –

+0

@Rob आपको कोई मैन्युअल रूपांतरण नहीं करना चाहिए। आपको 'सेट कैरेक्टर एन्कोडिंग ("यूटीएफ -8")' कॉल करना चाहिए और सामान्य जावा यूनिकोड स्ट्रिंग प्राप्त करने के लिए 'request.get पैरामीटर()' का उपयोग करना चाहिए। मुझे लगता है कि आपका कोड सामान्य एसीआईआई अक्षरों के साथ भी काम करता है? –

0

इसके अलावा आपको एक विशेष फ़िल्टर की आवश्यकता हो सकती है जो आपके अनुरोधों के एन्कोडिंग का ख्याल रखेगी। उदाहरण के लिए इस तरह के फिल्टर वसंत ढांचे में मौजूद है org.springframework.web.filter.CharacterEncodingFilter

0
String question = request.getParameter("searchWord"); 

सब आप अपने सर्वलेट कोड में क्या करना है है। इस बिंदु पर आपको एन्कोडिंग, वर्णमाला इत्यादि से निपटना नहीं है। यह सब सर्वलेट-इंफ्रास्ट्रक्चर द्वारा संभाला जाता है। जब आप ,?, ü कहीं भी प्रदर्शित करने जैसी समस्याओं को देखते हैं, तो ग्राहक द्वारा भेजे गए अनुरोध के साथ कुछ गलत हो सकता है। लेकिन कुछ बुनियादी ढांचे या लॉग इन HTTP-ट्रैफिक को जानने के बिना, यह कहना मुश्किल है कि क्या गलत है।

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