दिलचस्प पोस्ट
चेतावनी से छुटकारा कैसे प्राप्त करें: पीडब्ल्यूसी 4011: यूटीएफ -8 में अनुरोध वर्ण एन्कोडिंग सेट करने में असमर्थ JQuery में तत्व की कुल चौड़ाई (पैडिंग और सीमा सहित) लोकलहोस्ट तक पहुंच: एंड्रॉइड इम्यूलेटर से बंदरगाह जावास्क्रिप्ट फ़ंक्शन (क्लाइंट साइड) का निष्पादन रोकें या इसे ट्विक करें जावा स्ट्रिंग मान से मैं कैसे तलाश सकता हूं? MySQL शर्त के रूप में subquery से हटाएँ स्ट्रिंग को बोलना लेकिन उद्धरण चिह्नों के भीतर सीमांकक को अनदेखा करना कैसे जावास्क्रिप्ट बंद कर रहे हैं कचरा एकत्र Google Places API का उपयोग करना स्ट्रीम मैनिपुलेटर कैसे काम करते हैं? युद्ध में एनोटेशंस का उपयोग करके निष्पादन के सर्वलेट फिल्टर ऑर्डर को कैसे परिभाषित किया जाए कौन एक "नया" ऑपरेशन के दौरान आवंटित स्मृति को हटाता है जो निर्माता में अपवाद है? jQuery: आग क्लिक करें () धुंधला () ईवेंट से पहले स्विच स्टेटमेंट क्यों नहीं और अगर अन्यथा? स्टोरीबोर्ड को iPhone से लेकर iPad तक परिवर्तित करना

जावा वेबएप में यूटीएफ -8 कैसे काम करना है?

मुझे नियमित रूप से फिनिश टेक्स्ट और विशेष मामलों के लिए ЦжФ जैसे सीरिलिक वर्णों के लिए äöå -8 मेरे जावा वेबएप (सर्वलेट्स + जेएसपी, कोई ढांचा नहीं इस्तेमाल किया गया) में काम करने की आवश्यकता है ЦжФ

मेरा सेटअप निम्न है:

  • विकास वातावरण: Windows XP
  • उत्पादन वातावरण: डेबियन

उपयोग डेटाबेस: MySQL 5.x

उपयोगकर्ता मुख्य रूप से फ़ायरफ़ॉक्स 2 का इस्तेमाल करते हैं, लेकिन साइट पर ऐक्सेस करने के लिए ओपेरा 9.x, एफएफ 3, आईई 7 और गूगल क्रोम का इस्तेमाल होता है।

यह कैसे प्राप्त करें?

वेब के समाधान से एकत्रित समाधान "जावा वेबएप में यूटीएफ -8 कैसे काम करना है?"

अपने आप को इस साइट के सामान्य प्रश्न के रूप में उत्तर देने से इसे प्रोत्साहित किया जाता है। यह मेरे लिए काम करता है:

अधिकतर वर्ण äåö समस्याग्रस्त नहीं हैं क्योंकि वेबपेज के लिए ब्राउज़रों और टॉमकेट / जावा द्वारा इस्तेमाल किए जाने वाले डिफ़ॉल्ट वर्ण का सेट लैटिन 1 है। आईएसओ -8859-1 जो ​​उन वर्णों को "समझता है"।

जावा + टोमैक + लिनक्स / विंडोज + मैसूर के तहत यूटीएफ -8 काम करने के लिए निम्नलिखित की आवश्यकता है:

टोमकैट का सर्वर। Xml कॉन्फ़िगर करना

यह कॉन्फ़िगर करना आवश्यक है कि कनेक्टर url (GET अनुरोध) मानकों को एन्कोड करने के लिए UTF-8 का उपयोग करता है:

 <Connector port="8080" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" compression="on" compressionMinSize="128" noCompressionUserAgents="gozilla, traviata" compressableMimeType="text/html,text/xml,text/plain,text/css,text/ javascript,application/x-javascript,application/javascript" URIEncoding="UTF-8" /> 

उपर्युक्त उदाहरण में URIEncoding = "UTF-8" का मुख्य भाग है। यह quarantees है कि टोमैक सभी आने वाले GET पैरामीटर को UTF-8 एन्कोडेड के रूप में प्रबंधित करता है। परिणामस्वरूप, जब उपयोगकर्ता ब्राउज़र के पता बार में निम्नलिखित लिखता है:

  https://localhost:8443/ID/Users?action=search&name=*ж* 

चरित्र जी को यूटीएफ -8 के रूप में नियंत्रित किया जाता है और इसे आमतौर पर % D0% B6 के रूप में (आमतौर पर सर्वर से पहले ब्राउज़र द्वारा) एन्कोड किया जाता है।

पोस्ट अनुरोध इस से प्रभावित नहीं हैं

CharsetFilter

उसके बाद जावा वेबपैक्ट को यूटीएफ -8 एन्कोडेड के रूप में सभी अनुरोधों और प्रतिक्रियाओं को संभालने का समय है। इसके लिए आवश्यक है कि हम एक वर्ण सेट फ़िल्टर को निम्न की तरह परिभाषित करें:

 package fi.foo.filters; import javax.servlet.*; import java.io.IOException; public class CharsetFilter implements Filter { private String encoding; public void init(FilterConfig config) throws ServletException { encoding = config.getInitParameter("requestEncoding"); if (encoding == null) encoding = "UTF-8"; } public void doFilter(ServletRequest request, ServletResponse response, FilterChain next) throws IOException, ServletException { // Respect the client-specified character encoding // (see HTTP specification section 3.4.1) if (null == request.getCharacterEncoding()) { request.setCharacterEncoding(encoding); } // Set the default response content type and encoding response.setContentType("text/html; charset=UTF-8"); response.setCharacterEncoding("UTF-8"); next.doFilter(request, response); } public void destroy() { } } 

यह फिल्टर सुनिश्चित करता है कि अगर ब्राउज़र ने अनुरोध में उपयोग किए गए एन्कोडिंग को सेट नहीं किया है, तो यह UTF-8 पर सेट है।

इस फिल्टर द्वारा की गई दूसरी चीज डिफ़ॉल्ट प्रतिक्रिया एन्कोडिंग अर्थात् सेट करना है। एन्कोडिंग जिसमें लौटे एचटीएमएल / जो भी है वैकल्पिक रूप से आवेदन के प्रत्येक नियंत्रक में प्रतिक्रिया एन्कोडिंग आदि सेट करना है।

यह फिल्टर web.xml या वेबएप के परिनियोजन डिस्क्रिप्टर में जोड़ा जाना है:

  <!--CharsetFilter start--> <filter> <filter-name>CharsetFilter</filter-name> <filter-class>fi.foo.filters.CharsetFilter</filter-class> <init-param> <param-name>requestEncoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharsetFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 

इस फ़िल्टर को बनाने के निर्देश टॉमकेट विकी ( http://wiki.apache.org/tomcat/Tomcat/UTF-8 ) पर पाए जाते हैं

जेएसपी पृष्ठ एन्कोडिंग

अपने web.xml में , निम्न जोड़ें:

 <jsp-config> <jsp-property-group> <url-pattern>*.jsp</url-pattern> <page-encoding>UTF-8</page-encoding> </jsp-property-group> </jsp-config> 

वैकल्पिक रूप से, वेबपेज के सभी जेएसपी-पेजों को उन पर सबसे ऊपर दिए जाने की आवश्यकता होगी:

  <%@page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%> 

यदि अलग-अलग जेएसपी-टुकड़े के साथ किसी प्रकार का लेआउट उपयोग किया जाता है, तो यह सभी में इसकी आवश्यकता होती है।

HTML- मेटा टैग

JSP पृष्ठ एन्कोडिंग JSP को सही एन्कोडिंग में जेएसपी पेज में वर्णों को संभालने के लिए कहता है। तो फिर उस समय में वीआरएसर को बताने का समय है जिसमें एचटीएमएल पृष्ठ एन्कोडिंग है:

वेबएफ़ द्वारा उत्पादित प्रत्येक एक्सएचटीएमएल पेज के शीर्ष पर निम्नलिखित के साथ यह किया जाता है:

  <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fi"> <head> <meta http-equiv='Content-Type' content='text/html; charset=UTF-8' /> ... 

JDBC-कनेक्शन

डीबी का उपयोग करते समय, यह परिभाषित करना होगा कि कनेक्शन UTF-8 एन्कोडिंग का उपयोग करता है। यह context.xml में किया जाता है या जहां कहीं भी JDBC कनेक्शन defiend है:

  <Resource name="jdbc/AppDB" auth="Container" type="javax.sql.DataSource" maxActive="20" maxIdle="10" maxWait="10000" username="foo" password="bar" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/ ID_development?useEncoding=true&amp;characterEncoding=UTF-8" /> 

MySQL डाटाबेस और तालिकाओं

उपयोग किए गए डेटाबेस को UTF-8 एन्कोडिंग का उपयोग करना चाहिए। यह निम्नलिखित के साथ डेटाबेस बनाकर प्राप्त किया जाता है:

  CREATE DATABASE `ID_development` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_swedish_ci */; 

उसके बाद, सभी तालिकाओं को यूटीएफ -8 में भी होना चाहिए:

  CREATE TABLE `Users` ( `id` int(10) unsigned NOT NULL auto_increment, `name` varchar(30) collate utf8_swedish_ci default NULL PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_swedish_ci ROW_FORMAT=DYNAMIC; 

मुख्य भाग CHARSET = utf8 है

MySQL सर्वर कॉन्फ़िगरेशन

MySQL सर्वर को भी कॉन्फ़िगर करना होगा। आमतौर पर यह मेरी .inf-file और लिनक्स में my.cnf- file को बदलकर विंडोज़ में किया जाता है। उन फ़ाइलों में यह परिभाषित किया जाना चाहिए कि सर्वर से जुड़ा सभी क्लाइंट utf8 को डिफ़ॉल्ट वर्ण सेट के रूप में उपयोग करते हैं और सर्वर द्वारा उपयोग किए जाने वाले डिफ़ॉल्ट वर्णसेट भी utf8 है।

  [client] port=3306 default-character-set=utf8 [mysql] default-character-set=utf8 

Mysql प्रक्रियाओं और कार्यों

ये भी परिभाषित परिभाषित वर्ण निर्धारित करने की आवश्यकता है। उदाहरण के लिए:

  DELIMITER $$ DROP FUNCTION IF EXISTS `pathToNode` $$ CREATE FUNCTION `pathToNode` (ryhma_id INT) RETURNS TEXT CHARACTER SET utf8 READS SQL DATA BEGIN DECLARE path VARCHAR(255) CHARACTER SET utf8; SET path = NULL; ... RETURN path; END $$ DELIMITER ; 

अनुरोध प्राप्त करें: लैटिन 1 और यूटीएफ -8

अगर और टॉमकैट के सर्वर.एक्सएमएल में परिभाषित किया गया है, तो अनुरोध पैरामीटर UTF-8 में एन्कोड किए गए हैं, तो निम्नलिखित GET अनुरोध ठीक से नियंत्रित किए जाते हैं:

  https://localhost:8443/ID/Users?action=search&name=Petteri https://localhost:8443/ID/Users?action=search&name=ж 

चूंकि एएससीआईआई-अक्षरों को उसी प्रकार एन्कोड किया गया है, दोनों में लैटिन 1 और यूटीएफ -8 के साथ स्ट्रिंग "पेटीरी" को सही ढंग से संभाला जाता है।

सीरिलिक वर्ण जी को लैटिन 1 में समझा नहीं गया है। क्योंकि टॉमकेट को यूटीएफ -8 के रूप में अनुरोध मापदंडों को संभालने के लिए निर्देश दिया जाता है क्योंकि यह वर्ण सही रूप से % D0% B6 के रूप में एन्कोड करता है।

अगर और जब ब्राउज़र को यूटीएफ -8 एन्कोडिंग (अनुरोध शीर्षलेख और एचटीएमएल मेटा-टैग के साथ) में पृष्ठों को पढ़ने के लिए निर्देश दिए जाते हैं, तो कम से कम फ़ायरफ़ॉक्स 2/3 और इस अवधि के अन्य ब्राउज़रों को वर्ण खुद को % D0% B6 के रूप में एन्कोड करते हैं।

अंतिम परिणाम यह है कि "पेटीरी" नाम वाले सभी उपयोगकर्ता पाए जाते हैं और नाम के सभी उपयोगकर्ता "जी" पाए जाते हैं।

लेकिन क्या öö के बारे में?

HTTP- विनिर्देश यह परिभाषित करता है कि डिफ़ॉल्ट यूआरएल द्वारा लैटिन 1 के रूप में एन्कोड किया गया है। यह फ़ायरफ़ॉक्स 2, फ़ायरफ़ॉक्स 3 आदि का परिणाम है

  https://localhost:8443/ID/Users?action=search&name=*Päivi* 

एन्कोडेड संस्करण में

  https://localhost:8443/ID/Users?action=search&name=*P%E4ivi* 

लैटिन 1 में वर्ण को % E4 के रूप में एन्कोड किया गया है हालांकि पृष्ठ / अनुरोध / सब कुछ UTF-8 का उपयोग करने के लिए परिभाषित किया गया है यूटीएफ -8 एन्कोडेड संस्करण का ए है % सी 3% ए 4

इसका नतीजा यह है कि वेबपॉट के लिए अनुरोध मानकों को ठीक से GET अनुरोधों को संभाल करने के लिए यह काफी असंभव है क्योंकि कुछ अक्षर लैटिन 1 और अन्य यूटीएफ -8 में एन्कोडेड हैं। नोटिस: यदि यूटीएफ -8 के रूप में परिभाषित किया गया है, तो यूआरएफ -8 में पूरी तरह से प्रपत्रों से सभी अनुरोध पैरामीटर ब्राउज़रों के रूप में ब्राउज़ किए जाने के बाद पोस्ट अनुरोध काम करते हैं

सामग्री पढ़ने के लिए

मेरी समस्या के उत्तर देने के लिए निम्नलिखित के लेखकों के लिए बहुत बड़ा धन्यवाद:

महत्वपूर्ण लेख

mysql 3-बाइट यूटीएफ -8 वर्णों का उपयोग करते हुए मूलभूत बहुभाषी विमान का समर्थन करता है। यदि आपको उस के बाहर जाने की जरूरत है (कुछ वर्णों को यूटीएफ -8 के 3-बाइट्स से अधिक की आवश्यकता होती है), तो आपको या तो VARBINARY कॉलम प्रकार के स्वाद का उपयोग करने की आवश्यकता है या utf8mb4 वर्ण सेट का उपयोग करें (जो कि MySQL 5.5.3 या बाद के संस्करण की आवश्यकता है )। बस पता है कि MySQL में utf8 वर्ण सेट का उपयोग समय के 100% काम नहीं करेगा।

अपाचे के साथ बिलाव

एक और बात अगर आप अपाचे + टॉमकेट + मॉडिश जेक कनेक्टर का उपयोग कर रहे हैं तो आपको निम्न परिवर्तन करने की भी आवश्यकता है:

  1. यूआरआईएनसीडींग = "यूटीएफ -8" को 800 9 कनेक्टर के लिए टोमैकैट सर्वर.एक्सएमएल फ़ाइल में जोड़ें, इसका इस्तेमाल mod_JK कनेक्टर द्वारा किया जाता है। <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8"/>
  2. अपने अपाचे फ़ोल्डर को AddDefaultCharset utf-8 /etc/httpd/conf और httpd.conf file में AddDefaultCharset utf-8 जोड़ें। नोट: पहले यह जांचें कि यह मौजूद है या नहीं। यदि मौजूद है तो आप इसे इस लाइन के साथ अपडेट कर सकते हैं। आप इस रेखा को नीचे भी जोड़ सकते हैं।

मुझे लगता है कि आपने इसे अपने स्वयं के उत्तर में बहुत अच्छा बताया है।

यूटीएफ -8-आईएनजी (?) की अंत में समाप्त होने की प्रक्रिया में आप यह भी सुनिश्चित कर सकते हैं कि जावा ही यूटीएफ -8 का उपयोग कर रहा है JVM को पैरामीटर के रूप में -Dfile.encoding = utf-8 का उपयोग करें (catalina.bat में कॉन्फ़िगर किया जा सकता है)।

कोसोन्ट का जवाब जोड़ने के लिए, यदि आप स्प्रिंग का प्रयोग कर रहे हैं, तो अपना खुद का सर्विसलेट फ़िल्टर लिखने के बजाय, आप वर्ग org.springframework.web.filter.CharacterEncodingFilter उपयोग कर सकते हैं, इसे अपने web.xml में निम्नलिखित की तरह कॉन्फ़िगर कर सकते हैं:

  <filter> <filter-name>encoding-filter</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>FALSE</param-value> </init-param> </filter> <filter-mapping> <filter-name>encoding-filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 

यह MySql तालिकाओं में ग्रीक एन्कोडिंग के लिए है, जब हम उन्हें जावा का उपयोग करना चाहते हैं:

अपने JBoss कनेक्शन पूल (mysql-ds.xml) में निम्न कनेक्शन सेटअप का उपयोग करें

 <connection-url>jdbc:mysql://192.168.10.123:3308/mydatabase</connection-url> <driver-class>com.mysql.jdbc.Driver</driver-class> <user-name>nts</user-name> <password>xaxaxa!</password> <connection-property name="useUnicode">true</connection-property> <connection-property name="characterEncoding">greek</connection-property> 

यदि आप इसे किसी JNDI कनेक्शन पूल में नहीं रखना चाहते हैं, तो आप इसे अगली पंक्ति की तरह JDBC-url के रूप में कॉन्फ़िगर कर सकते हैं:

 jdbc:mysql://192.168.10.123:3308/mydatabase?characterEncoding=greek 

मेरे और निक के लिए, हम इसे कभी भी नहीं भूल जाते हैं और अब समय बर्बाद करते हैं …..

अच्छा विस्तृत उत्तर सिर्फ एक और चीज जोड़ना चाहती थी जो निश्चित रूप से यूटिफ़ -8 एन्कोडिंग को यूआरएल पर कार्रवाई करने में दूसरों की मदद करेगी।

फ़ायरफ़ॉक्स में URL पर यूटीएफ -8 एन्कोडिंग को सक्षम करने के लिए नीचे दिए गए चरणों का पालन करें।

  1. पता बार में "about: config" टाइप करें

  2. "Network.standard-url.encode-query-utf8" संपत्ति के लिए खोज करने के लिए फ़िल्टर इनपुट प्रकार का उपयोग करें

  3. उपरोक्त संपत्ति को डिफ़ॉल्ट रूप से गलत होगा, उस पर TRUE चालू करें
  4. ब्राउज़र को पुनरारंभ करें

URL पर यूटीएफ -8 एन्कोडिंग डिफ़ॉल्ट रूप से IE6 / 7/8 और क्रोम में काम करता है

मैं यहां से भी जोड़ना चाहता हूं, इस भाग ने मेरी यूटीएफ समस्या हल की:

 runtime.encoding=<encoding> 

मैं एक ऐसी ही समस्या के साथ हूं, लेकिन, फ़ाइल के नाम से मैं अपाचे कॉमर्स के साथ संकुचित हो रहा हूं इसलिए, मैंने इसे इस आदेश के साथ हल किया:

 convmv --notest -f cp1252 -t utf8 * -r 

यह मेरे लिए बहुत अच्छी तरह से काम करता है आशा है कि यह किसी को मदद;)

संदेश बंडलों से यूनिकोड वर्ण प्रदर्शित करने के मेरे मामले के लिए, मेरे जेस्प पेज पर यूनिकोड को प्रदर्शित करने के लिए "जेएसपी पेज एन्कोडिंग" अनुभाग को लागू करने की आवश्यकता नहीं है I मुझे केवल "वर्णसेटफिल्टर" अनुभाग की आवश्यकता है

एक अन्य बिंदु का उल्लेख नहीं किया गया है जो Ajax के साथ काम कर रहे जावा Servlets से संबंधित है। मेरे पास ऐसे परिस्थिति हैं जहां एक वेब पेज यूटएफ -8 पाठ को उपयोगकर्ता द्वारा जावास्क्रिप्ट फ़ाइल में भेज रहा है, जिसमें यह यूआरएल में शामिल किया गया है जिसमें सर्विसलेट को भेजा गया था। सर्विसलेट एक डेटाबेस से पूछता है, परिणाम को कैप्चर करता है और उसे एक्सएमएल के रूप में जावास्क्रिप्ट फ़ाइल में लौटाता है जो उसे प्रारूपित करता है और मूल वेब पेज में फ़ॉर्मेटेड रिस्पॉन्स को सम्मिलित करता है।

एक वेब ऐप में मैं यूआरआई के निर्माण के लिए जावास्क्रिप्ट को लपेटने के लिए शुरुआती अजेक्स बुक के निर्देशों का पालन कर रहा था। पुस्तक में उदाहरण से बच () विधि का इस्तेमाल किया गया था, जिसे मैंने पाया (कठिन रास्ता) गलत है यूटीएफ -8 के लिए आपको एनकोडुरआईकंपनी () का उपयोग करना चाहिए

कुछ लोग इन दिनों अपने स्वयं के अजेक्स को रोल करते हुए लगते हैं, लेकिन मैंने सोचा कि मैं यह भी जोड़ सकता हूं।

CharsetFilter बारे में @ कोसोन्ट उत्तर में वर्णित है ….

टॉमकेट वेब। web.xml में Filter ( conf/web.xml पर स्थित) में एक बिल्ड है। फ़िल्टर का नाम setCharacterEncodingFilter नाम दिया setCharacterEncodingFilter और डिफ़ॉल्ट रूप से टिप्पणी की गई है। आप इसे हटा सकते हैं (कृपया अपने filter-mapping भी रद्द करना याद रखें)

इसके अलावा आपके वेब। web.xml में jsp-config सेट करने की कोई आवश्यकता नहीं है (मैं इसे टॉमकैट 7+ के लिए परीक्षण करता हूं)

कुछ समय आप MySQL व्यवस्थापक विज़ार्ड के माध्यम से समस्या हल कर सकते हैं। में

स्टार्टअप चर> उन्नत>

और डीईएफ़ सेट करें चार सेट: यूटीएफ 8

हो सकता है कि इस कॉन्फ़िगरेशन को MySQL को पुनरारंभ करना आवश्यक है

यदि आपने कनेक्शन पूल (mysql-ds.xml) में निर्दिष्ट किया है, तो अपने जावा कोड में आप निम्नानुसार कनेक्शन खोल सकते हैं:

 DriverManager.registerDriver(new com.mysql.jdbc.Driver()); Connection conn = DriverManager.getConnection( "jdbc:mysql://192.168.1.12:3308/mydb?characterEncoding=greek", "Myuser", "mypass");