2012-06-07 20 views
5

मैं जावा/जेएसपी/टोमकैट/माइस्क्ल का उपयोग करके एक साधारण वेब एप्लिकेशन विकसित कर रहा हूं, और सबसे अधिक समस्या चरित्र एन्कोडिंग पर निहित है क्योंकि मुझे डिफ़ॉल्ट 8851 के बजाय यूटीएफ -8 एन्कोडिंग से निपटने की आवश्यकता हैजावा टॉमकैट यूटीएफ -8 एन्कोडिंग समस्या

सबसे पहले मैं अपनी प्रोग्राम संरचना का वर्णन करना चाहता हूं। मैं सभी अनुरोधों को संभालने के लिए Controller.java नामक एक सर्वलेट का उपयोग कर रहा हूं। तो web.xml में, मेरे पास एक नियंत्रक सर्वलेट है जो * .do से सभी अनुरोध करता है।

फिर यह नियंत्रक अनुरोधित यूआरएल के आधार पर अनुरोध भेज देगा, उदाहरण के लिए, यदि ग्राहक रजिस्टर के लिए पूछता है, तो नियंत्रक Register.java को अनुरोध भेज देगा।

और Register.java में, वहाँ एक तरीका है जिसके पैरामीटर, अर्थात् के रूप में अनुरोध लेता है:

public String perform(HttpServletRequest request) { 
    do something with the request... 
} 

तो समस्या यह है कि अगर मैं इस विधि के अंदर UTF-8 में कुछ प्रिंट करना चाहते हैं, यह यादृच्छिक पात्र देंगे। उदाहरण के लिए, मेरे पास एक एनम है जो कई स्थिरांक स्टोर करता है, पारंपरिक चीनी में एनम का नाम है। अगर मैं इसे

public static void main(Stirng[] args{ 
    System.out.println(MyEnum.One.getChn()); 
    logger.info(MyEnum.One.getChn()); 
} 

में प्रिंट करता है तो यह चीनी में सही ढंग से मुद्रित होता है। हालांकि, अगर मैं विधि HttpServletRequest से निपटने के अंदर सटीक कोड डाल:

public String perform(HttpServletRequest request) { 
    System.out.println(MyEnum.One.getChn()); 
    logger.info(MyEnum.One.getChn()); 
} 

वे यादृच्छिक पात्रों के रूप में मुद्रित कर रहे हैं, लेकिन मैं डिबग खिड़की (ग्रहण) है कि चर सही चीनी अक्षरों पकड़े हुए हैं से देख सकते हैं।

तो, वही स्थिति तब होती है जब मैं अनुरोध से मूल्य संग्रह करना चाहता हूं .getParameter()। डीबग विंडो में, मैं देख सकता हूं कि चर सही अक्षर धारण कर रहा है, लेकिन एक मैं इसे प्रिंट करता हूं या इसे डेटाबेस में संग्रहीत करने का प्रयास करता हूं, यह यादृच्छिक वर्ण है।

मुझे नहीं पता कि व्यवहार इस तरह क्यों कार्य करता है, और यह मुझे सबमिट किए गए फॉर्म मान पढ़ने और उन्हें डेटाबेस में संग्रहीत करने से रोक रहा है। क्या कोई इस पर कुछ संकेत दे सकता है?

ग्रेट धन्यवाद।

+1

मैं नहीं समझ सकता है कि क्या आप में सर्वर के कंसोल और लॉग, पर भ्रष्ट आउटपुट * या * भ्रष्ट उत्पादन को लेकर चिंतित हैं ब्राउज़र के परिणामस्वरूप प्रतिक्रिया। क्या आप स्पष्ट कर सकते हो? – erickson

+2

'System.getProperty ("file.encoding") का मान क्या है? – erickson

+0

मुझे इस बारे में चिंता है कि डीबग विंडो में मैं सही एन्कोडिंग देख सकता हूं, लेकिन जब मैं चर को अपने डेटाबेस एक्सेस ऑब्जेक्ट में पास करता हूं और इसे डीबी पर संग्रहीत करता हूं, तो यह यादृच्छिक वर्ण बन जाएगा। तो मैंने पाया कि अनुरोधों से निपटने की विधि में, यहां तक ​​कि बस यूटीएफ -8 एनम मूल्य मुद्रित भी काम नहीं करता है। –

उत्तर

5

आप UTF-8 एन्कोडिंग का उपयोग करने की जरूरत है (और वास्तव में, हर कोई इन दिनों यह जा रहा किया जाना चाहिए), तो आप "UTF-8 हर जगह विधिपत्र" बिलाव सामान्य प्रश्न में देखा का पालन कर सकते हैं:

http://wiki.apache.org/tomcat/FAQ/CharacterEncoding#Q8

याद रखें कि आपको अपने डेटाबेस के टेक्स्ट फ़ील्ड में यूटीएफ -8 का समर्थन करने की भी आवश्यकता है।

भी याद रखें कि कभी कभी "छपाई" एक लॉग फ़ाइल या कंसोल के लिए उस में गैर- ASCII वर्ण के साथ एक स्ट्रिंग द्वारा

  1. प्रभावित किया जा सकता उत्पादन धारा
  2. वर्ण एन्कोडिंग का वर्ण एन्कोडिंग फ़ाइल पाठक के (जैसे बिल्ली/कम/vi)
  3. चरित्र टर्मिनल की एन्कोडिंग

आपने किसी फ़ाइल का मान लेखन और फिर एक हेक्स ईडीआई का उपयोग कर से बेहतर हो सकता है यह सुनिश्चित करने के लिए सामग्री की जांच करने के लिए टोर करें कि आप बाइट वैल्यू प्राप्त कर रहे हैं जिन्हें आप ढूंढ रहे हैं।

public class CharacterEncodingFilter implements Filter { 

    @Override 
    public void init(FilterConfig filterConfig) 
      throws ServletException { 

    } 

    @Override 
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) 
      throws IOException, ServletException { 
     servletRequest.setCharacterEncoding("UTF-8"); 
     servletResponse.setContentType("text/html; charset=UTF-8"); 
     filterChain.doFilter(servletRequest, servletResponse); 
    } 

    @Override 
    public void destroy() { 

    } 
} 

आपके पास:

आप वर्ण एन्कोडिंग के लिए अपने आवेदन में फ़िल्टर लागू करने के लिए है:

+0

यूटीएफ -8 हर जगह ग्रहण में: [आपके ग्रहण जावा परियोजनाओं में यूनिकोड/यूटीएफ -8] (http://stijndewitt.wordpress.com/2010/05/05/unicode-utf-8-in-eclipse-java/) –

8

यहां एक छोटा ट्यूटोरियल आप अपने वेब अनुप्रयोग में UTF-8 काम करने के लिए क्या करने की जरूरत है यह सुनिश्चित करने के लिए कि आपके tomcat के server.xml की फ़ाइल कनेक्टर तत्व में URIEncoding विशेषता है जो यूटीएफ -8 है।

<Connector port="8080" 
      protocol="HTTP/1.1" 
      connectionTimeout="20000" 
      URIEncoding="UTF-8" 
      redirectPort="8443"/> 

इसके अलावा, आप हर JSP पेज में इस निर्दिष्ट करना होगा:

<%@page contentType="text/html" pageEncoding="UTF-8"%> 
+1

वास्तव में, फ़िल्टर के बजाय, मुझे लगता है कि आप इसे अपने जेएसपी में डाल सकते हैं: '<% @ पृष्ठ भाषा =" जावा "सामग्री टाइप =" टेक्स्ट/एचटीएमएल; वर्णसेट = यूटीएफ -8 "पृष्ठ एन्कोडिंग =" यूटीएफ -8 "%> ' –

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