2013-04-16 5 views
8

मैं एक फॉर्म सबमिट करने की कोशिश कर रहा हूं, जिसमें इसके अंदर यूटीएफ 8 वर्ण हैं। प्रपत्र इस तरह दिखता है:फॉर्म पोस्ट और स्प्रिंग कंट्रोलर के साथ यूटीएफ -8 एन्कोडिंग

<form id="workflowPersistForm" accept-charset="UTF-8" method="post" action="/workflow-next">> 
    <input id="stateGlobal" type="hidden" value=" お問い合わせ" name="state"> 
</form> 

मेरे सर्वर एक वसंत आधारित है। मेरे web.xml पहले से ही एन्कोडिंग फ़िल्टर है:

<filter> 
    <filter-name>EncodingFilter</filter-name> 
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 
    <init-param> 
     <param-name>encoding</param-name> 
     <param-value>UTF-8</param-value> 
    </init-param> 
    <init-param> 
     <param-name>forceEncoding</param-name> 
     <param-value>true</param-value> 
    </init-param> 
</filter> 

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

कोई विचार क्या मैं गलत कर रहा हूं?

संपादित करें: ऐसा लगता है कि नए पृष्ठ डेटा में गड़बड़ नहीं हुई है, लेकिन इसकी डबल एन्कोडेड है। मैं समझने में असमर्थ हूं कि यह डबल एन्कोडेड क्यों है।

संपादित करें 2: जब मैं पोस्ट के बजाय फॉर्म को बदलता हूं, तो सब कुछ पूरी तरह से काम करता है। मुझे नहीं पता कि पोस्ट क्या टूट रहा है।

उत्तर

10

ब्राउज़रों की तरह लग रहा अनुरोध शीर्षों में सामग्री प्रकार के भाग के रूप चारसेट नहीं भेजते हैं (यहां तक ​​कि जब स्वीकार-चारसेट फार्म पर सेट किया जाता है) के रूप में लैटिन -1 ऐसे अनुरोधों के शरीर के साथ और बिलाव सौदों (http://wiki.apache.org/tomcat/FAQ/CharacterEncoding#Q1)।

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

शीर्ष पर ले जाने वाला कैरेक्टर एन्कोडिंग फ़िल्टर और यूटीएफ -8 के रूप में सेट करने के लिए एन्कोडिंग को मजबूर करने से समस्या हल हो गई है।

+0

कई जुड़ी समस्याएं, लेकिन वास्तविक समस्या वेब.एक्सएमएल में फ़िल्टर ऑर्डर के साथ थी –

1

मैं सुझाव दूंगा कि आप CharacterEncodingFilter को हटा दें, जो स्वयं डबल एन्कोडिंग का कारण हो सकता है।

अभिवादन को डीबग करने के लिए, आपको पहले यह जांचना चाहिए कि ब्राउज़र डेटा को सही तरीके से पोस्ट कर रहा है या नहीं। क्रोम पर फ़ायरबग (फ़ायरफ़ॉक्स के लिए) या डेवलपर टूल्स का उपयोग करें (एफ 12)

सबसे अधिक संभावना है, समस्या सर्वर की तरफ है। आप किस सर्वर का उपयोग करते हैं? आप बिलाव का उपयोग करते हैं, तो आप server.xml में कनेक्टर तत्व पर UTF-8 में CharsetEncoding निर्धारित करने की आवश्यकता

अद्यतन 1:

यह बहुत संभव है कि समस्या forceEncoding है कि आप सेट कर रहे हैं है लग रहा है । के रूप में प्रति docs

इस फिल्टर इसकी एन्कोडिंग आवेदन कर सकते हैं या तो यदि अनुरोध नहीं है पहले से ही एनकोडिंग निर्दिष्ट, या ("forceEncoding" = "true")

किसी भी मामले में इस फिल्टर के कूट लागू

जब आप प्राप्त करते हैं, तो कोई एन्कोडिंग निर्दिष्ट नहीं होती है, इसलिए यह समझ में आता है कि यह काम करता है।

लेकिन जब आप पोस्ट करते हैं, एन्कोडिंग को पहले से ही लागू किया जाता है और उसके बाद (ऐसा लगता है) forceEncoding = सच की वजह से फिर से लागू किया जाता है

+0

मैंने फायरबग की जांच की सबकुछ अच्छी लगती है। अगर मैं सिर्फ पोस्ट के बजाय अनुरोध प्राप्त करता हूं, तो सब कुछ काम करता है। – Bulbasaur

+0

अद्यतन उत्तर – arahant

+0

नहीं देखें, यह फ़िल्टर वास्तव में कुछ भी एन्कोड नहीं करता है, यह केवल अनुरोध के एन्कोडिंग को यूटीएफ 8 के रूप में सेट करता है। वास्तव में करने के लिए सही चीज कौन सा है। – Bulbasaur

4

आप EncodingFilter के लिए अपने web.xml में एक फिल्टर-मैपिंग प्रविष्टि है ?

<filter-mapping> 
    <filter-name>EncodingFilter</filter-name> 
    <url-pattern>*</url-pattern> 
</filter-mapping> 
+0

हां, मैपिंग पहले से मौजूद है। – Bulbasaur

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