Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

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

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

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

UTF-8 को Java+Tomcat+Linux/Windows+Mysql के तहत काम करने के लिए निम्नलिखित की आवश्यकता है:

Tomcat के सर्वर को कॉन्फ़िगर करना.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" उपरोक्त उदाहरण में। यह संगरोध करता है कि टॉमकैट सभी आने वाले जीईटी पैरामीटर को यूटीएफ -8 एन्कोडेड के रूप में संभालता है। नतीजतन, जब उपयोगकर्ता ब्राउज़र के एड्रेस बार में निम्नलिखित लिखता है:

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

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

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

चारसेटफ़िल्टर

फिर जावा वेबएप को यूटीएफ -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>

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

JSP पेज एन्कोडिंग

आपके 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"%>

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

HTML-मेटा टैग

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

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

   <?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-कनेक्शन

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

      <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 */;

फिर, सभी तालिकाओं को UTF-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 सर्वरी को भी कॉन्फ़िगर करना होगा। आमतौर पर यह विंडोज़ में my.ini . को संशोधित करके किया जाता है -फ़ाइल और Linux में my.cnf . को कॉन्फ़िगर करके -file. उन फाइलों में यह परिभाषित किया जाना चाहिए कि सर्वर से जुड़े सभी क्लाइंट डिफ़ॉल्ट वर्ण सेट के रूप में utf8 का उपयोग करते हैं और सर्वर द्वारा उपयोग किया जाने वाला डिफ़ॉल्ट वर्णसेट भी utf8 है।

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

   [mysql]
   default-character-set=utf8

मैसकल प्रक्रियाएं और कार्य

इन्हें चरित्र सेट को परिभाषित करने की भी आवश्यकता है। उदाहरण के लिए:

   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 ;

अनुरोध प्राप्त करें:latin1 और UTF-8

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

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

चूंकि ASCII-वर्णों को लैटिन 1 और UTF-8 दोनों के साथ एक ही तरीके से एन्कोड किया गया है, इसलिए स्ट्रिंग "पेटेरी" को सही तरीके से संभाला जाता है।

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

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

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

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

HTTP-विनिर्देश परिभाषित करता है कि डिफ़ॉल्ट रूप से URL को latin1 के रूप में एन्कोड किया जाता है। इसका परिणाम फ़ायरफ़ॉक्स 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 का उपयोग करने के लिए परिभाषित हो . ä का UTF-8 एन्कोडेड संस्करण %C3%A4 . है

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

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

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

  • http://tagunov.tripod.com/i18n/i18n.html
  • http://wiki.apache.org/tomcat/Tomcat/UTF-8
  • http://java.sun.com/developer/technicalArticles/Intl/HTTPCharset/
  • http://dev.mysql.com/doc/refman/5.0/en/charset-syntax.html
  • http://cagan327.blogspot.com/2006/05/utf-8-encoding-fix-tomcat-jsp-etc.html
  • http://cagan327.blogspot.com/2006/05/utf-8-encoding-fix-for-mysql-tomcat.html
  • http://jeppesn.dk/utf-8.html
  • http://www.nabble.com/request-parameters-mishandle-utf-8-encoding-td18720039.html
  • http://www.utoronto.ca/webdocs/HTMLdocs/NewHTML/iso_table.html
  • http://www.utf8-chartable.de/

महत्वपूर्ण नोट

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

अपाचे के साथ टॉमकैट

एक और बात यदि आप Apache + Tomcat + mod_JK कनेक्टर का उपयोग कर रहे हैं तो आपको निम्नलिखित परिवर्तन भी करने होंगे:

  1. 8009 कनेक्टर के लिए tomcat server.xml फ़ाइल में URIEncoding="UTF-8" जोड़ें, इसका उपयोग mod_JK कनेक्टर द्वारा किया जाता है।
  2. अपना अपाचे फोल्डर यानी /etc/httpd/conf पर जाएं और जोड़ें AddDefaultCharset utf-8 httpd.conf फ़ाइल . में . नोट: पहले जांचें कि यह मौजूद है या नहीं। यदि मौजूद है तो आप इसे इस लाइन से अपडेट कर सकते हैं। आप इस लाइन को नीचे भी जोड़ सकते हैं।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mysql में पंक्तियों के एक सेट पर संचयी योग

  2. MySQL - डेटाबेस में मौजूद होने पर टेबल कैसे छोड़ें?

  3. MySQL में सूचनाओं के लिए डेटाबेस डिजाइन करने के लिए गाइड

  4. मैं एक MySQL तालिका में कॉलम के आकार को कैसे संशोधित कर सकता हूं?

  5. MySQL में पदानुक्रमित डेटा से गहराई आधारित पेड़ उत्पन्न करना (कोई सीटीई नहीं)