2012-06-12 18 views
10

में जीईटी पैरामीटर के यूटीएफ -8 एन्कोडिंग मेरे पास जेएसएफ में एक खोज फ़ॉर्म है जिसे रिचफैस 4 ऑटोकंपलेट घटक और निम्नलिखित जेएसएफ 2 पेज और जावा बीन का उपयोग करके लागू किया गया है। मैं एप्लिकेशन चलाने के लिए टोमकैट 6 & 7 का उपयोग करता हूं।जेएसएफ

... 
<h:commandButton value="#{msg.search}" styleClass="search-btn" action="#{autoCompletBean.doSearch}" /> 
... 

AutoCompleteBean

public String doSearch() { 

    //some logic here 
    return "/path/to/page/with/multiple_results?query=" + searchQuery + "&amp;faces-redirect=true"; 

} 

में यह सब कुछ "SEARCHQUERY" स्ट्रिंग लैटिन -1 में है के भीतर के रूप में लंबे समय के रूप में अच्छी तरह से काम करता है, यह अगर लैटिन -1 के बाहर है काम नहीं करता।

उदाहरण के लिए "bodø" की खोज स्वचालित रूप से "बोड% F8" के रूप में एन्कोड की जाएगी। हालांकि "क्रा Ðong" की खोज काम नहीं करेगी क्योंकि यह "Ð" एन्कोड करने में असमर्थ है।

मैंने अब इसे हल करने के लिए कई अलग-अलग दृष्टिकोणों की कोशिश की है, लेकिन उनमें से कोई भी काम नहीं करता है।

  • मैंने यूआरएलएनकोड का उपयोग करके खोज स्वयं को एन्कोड करने का प्रयास किया है, लेकिन यह केवल डबल एन्कोडिंग की ओर जाता है क्योंकि%% 25 के रूप में एन्कोड किया गया है।
  • मैंने एन्कोडिंग प्राप्त करने के लिए java.net.URI का उपयोग करने का प्रयास किया है, लेकिन यूआरएलएनकोड के समान परिणाम देता है।
  • मैंने कनेक्टर में URIEncoding = "UTF-8" का उपयोग करके टोमकैट में यूटीएफ -8 को चालू करने का प्रयास किया है, लेकिन यह केवल उस समस्या को खराब करता है जब से गैर-असीसी वर्ण बिल्कुल काम नहीं करते हैं।

तो अपने सवालों के:

  1. मैं बदल सकते हैं जिस तरह से JSF 2 GET पैरामीटर encodes?
  2. यदि मैं जेएसएफ 2 जीईटी पैरामीटर को एन्कोड करने का तरीका नहीं बदल सकता, तो क्या मैं एन्कोडिंग चालू कर सकता हूं और इसे मैन्युअल रूप से कर सकता हूं?
  3. क्या मैं यहाँ कुछ अजीब कर रहा हूं? ऐसा कुछ ऐसा लगता है जिसे बॉक्स के बाहर समर्थित किया जाना चाहिए, लेकिन मुझे एक ही समस्या के साथ कोई अन्य नहीं मिल रहा है।

उत्तर

9

मुझे लगता है कि आपने जेएसएफ में कोने केस बग मारा है। क्वेरी स्ट्रिंग ExternalContext#encodeRedirectURL() द्वारा URL-encoded है जो ExternalContext#getResponseCharacterEncoding() द्वारा प्राप्त प्रतिक्रिया वर्ण एन्कोडिंग का उपयोग करती है। हालांकि, जब डिफ़ॉल्ट रूप से जेएसएफ यूटीएफ -8 का उपयोग प्रतिक्रिया चरित्र एन्कोडिंग के रूप में करता है, तो यह केवल तभी सेट किया जाता है जब दृश्य वास्तव में प्रस्तुत किया जाता है, न कि जब प्रतिक्रिया को पुनर्निर्देशित किया जाता है, तो प्रतिक्रिया वर्ण एन्कोडिंग अभी भी ISO-8859-1 का प्लेटफ़ॉर्म डिफ़ॉल्ट देता है जो इस गलत एन्कोडिंग का उपयोग करके आपके पात्रों को यूआरएल-एनकोडेड होने का कारण बनता है।

मैंने इसे issue 2440 के रूप में रिपोर्ट किया है। इस बीच आपकी सबसे अच्छी शर्त स्पष्ट रूप से प्रतिक्रिया वर्ण एन्कोडिंग को पहले से सेट करना है।

FacesContext.getCurrentInstance().getExternalContext().setResponseCharacterEncoding("UTF-8"); 

नोट यह अभी भी जरूरी है कि कंटेनर में ही अनुरोध URL डिकोड करने के लिए एक ही वर्ण एन्कोडिंग का उपयोग करें, ताकि आप निश्चित रूप से बिलाव के कॉन्फ़िगरेशन में URIEncoding="UTF-8" सेट करना होगा। यह अब पात्रों को गड़बड़ नहीं करेगा क्योंकि वे वास्तव में यूटीएफ -8 होंगे।

+0

हां, यह काम करता है। धन्यवाद! – oyse

+0

आपका स्वागत है :) – BalusC

0

HTTP यूआरएल और हेडर के लिए स्वीकार किया गया एकमात्र वर्ण एन्कोडिंग यूएस-एएससीआईआई है, आपको इन पात्रों को एप्लिकेशन को वापस भेजने के लिए इन वर्णों को एन्कोड करने की आवश्यकता है। जावा में ऐसा करने का सबसे आसान तरीका होगा:

public String doSearch() { 

    //some logic here 
    String encodedSearchQuery = java.net.URLEncoder.encode(searchQuery, "UTF-8"); 
    return "/path/to/page/with/multiple_results?query=" + encodedSearchQuery + "&amp;faces-redirect=true"; 

} 

और फिर यह आपके द्वारा उपयोग किए जाने वाले किसी भी चरित्र के लिए काम करना चाहिए।

+0

जेएसएफ यह स्पष्ट रूप से करता है। कम से कम, ऐसा करना है। एक बार फिर प्रश्न पढ़ें। जैसे * "मैंने URLENcode का उपयोग करके खोज स्वयं को एन्कोड करने का प्रयास किया है, लेकिन यह केवल डबल एन्कोडिंग की ओर जाता है क्योंकि%% 25 के रूप में एन्कोड किया गया है।" * – BalusC