इस साइट के FAQ के रूप में खुद को जवाब देना इसे प्रोत्साहित करता है। यह मेरे लिए काम करता है:
ज्यादातर वर्ण äåö एक समस्याग्रस्त नहीं हैं क्योंकि वेब ब्राउज़र के लिए ब्राउज़र और टॉमकैट / जावा द्वारा उपयोग किए जाने वाले डिफ़ॉल्ट चरित्र लैटिन 1 है। ISO-8859-1 जो उन पात्रों को "समझता" है।
Java + Tomcat + Linux / Windows + Mysql के तहत काम करने के लिए UTF-8 प्राप्त करने के लिए निम्नलिखित की आवश्यकता है:
टॉमकैट के server.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" प्रमुख हिस्सा है । यह बताता है कि टॉमकैट आने वाले सभी GET मापदंडों को UTF-8 के रूप में इनकोड करता है। परिणामस्वरूप, जब उपयोगकर्ता ब्राउज़र के एड्रेस बार पर निम्नलिखित लिखता है:
https://localhost:8443/ID/Users?action=search&name=*ж*
चरित्र ж को UTF-8 के रूप में संभाला जाता है और % D0% B6 के रूप में (आमतौर पर सर्वर तक पहुंचने से पहले ब्राउज़र द्वारा) को इनकोड किया जाता है ।
POST अनुरोध इससे प्रभावित नहीं हैं।
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 पर सेट है।
इस फ़िल्टर द्वारा की गई दूसरी चीज़ डिफ़ॉल्ट प्रतिक्रिया एन्कोडिंग को सेट करना है। एन्कोडिंग जिसमें html / जो कुछ भी है उसे लौटा दिया। विकल्प अनुप्रयोग के प्रत्येक नियंत्रक में प्रतिक्रिया एन्कोडिंग आदि को सेट करना है।
इस फ़िल्टर को web.xml या webapp के परिनियोजन वर्णक में जोड़ा जाना है :
<!--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 ) पर पाए जाते हैं ।
JSP पेज एन्कोडिंग
अपने web.xml में , निम्नलिखित जोड़ें:
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<page-encoding>UTF-8</page-encoding>
</jsp-property-group>
</jsp-config>
वैकल्पिक रूप से, वेब के सभी JSP- पेजों को उनमें से शीर्ष पर निम्नलिखित की आवश्यकता होगी:
<%@page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%>
यदि विभिन्न JSP- अंशों के साथ किसी प्रकार का लेआउट उपयोग किया जाता है, तो यह उन सभी में आवश्यक है ।
HTML- मेटा टैग
JSP पेज एन्कोडिंग JVM को सही एन्कोडिंग में 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-कनेक्शन
डीबी का उपयोग करते समय, यह परिभाषित करना होगा कि कनेक्शन UTF-8 एन्कोडिंग का उपयोग करता है। यह संदर्भ में किया जाता है। xml या जहाँ भी JDBC कनेक्शन इस प्रकार से परिभाषित है:
<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&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 serveri को भी कॉन्फ़िगर करना होगा। आमतौर पर यह विंडोज़ में my.ini -file और Linux में my.cnf -file को कॉन्फ़िगर करके किया जाता है । उन फ़ाइलों में यह परिभाषित किया जाना चाहिए कि सर्वर से जुड़े सभी क्लाइंट utf8 को डिफ़ॉल्ट वर्ण सेट के रूप में उपयोग करते हैं और सर्वर द्वारा उपयोग किया जाने वाला डिफ़ॉल्ट charset भी 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 ;
अनुरोध प्राप्त करें: लैटिन 1 और यूटीएफ -8
अगर और जब इसे टॉमकैट के server.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 में सिरिलिक चरित्र ж को बिल्कुल भी नहीं समझा गया है। क्योंकि टॉमकैट को अनुरोध मापदंडों को संभालने के लिए निर्देश दिया जाता है क्योंकि UTF-8 के रूप में यह उस चरित्र को सही ढंग से % D0% B6 के रूप में एन्कोड करता है ।
यदि और जब ब्राउज़रों को UTF-8 एन्कोडिंग (अनुरोध हेडर और HTML मेटा-टैग के साथ) में पृष्ठों को पढ़ने का निर्देश दिया जाता है, तो इस अवधि से कम से कम फ़ायरफ़ॉक्स 2/3 और अन्य ब्राउज़र सभी वर्णों को स्वयं % D0% B6 के रूप में एन्कोड करते हैं ।
अंतिम परिणाम यह है कि "पेट्री" नाम के सभी उपयोगकर्ता पाए जाते हैं और "ж" नाम वाले सभी उपयोगकर्ता भी पाए जाते हैं।
लेकिन äåö के बारे में क्या?
HTTP- विनिर्देशन यह परिभाषित करता है कि डिफ़ॉल्ट URL द्वारा लैटिन 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 का उपयोग करने के लिए परिभाषित किया गया हो । Ä का UTF-8 एन्कोडेड संस्करण % C3% A4 है
इसका नतीजा यह है कि वेब के लिए जीईटी अनुरोधों से अनुरोध पैरामीटर को आसानी से संभालना असंभव है क्योंकि कुछ वर्ण यूटीएफ -8 में लैटिन और अन्य में कूटबद्ध हैं।
सूचना: POST अनुरोध ब्राउज़र के रूप में काम करते हैं, सभी अनुरोधों को पूरी तरह से UTF-8 में प्रपत्रों से कूटबद्ध करते हैं, यदि पृष्ठ को FF-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 वर्णों का उपयोग करके मूल बहुभाषी विमान का समर्थन करता है । यदि आपको इसके बाहर जाने की आवश्यकता है (कुछ अक्षर को UTF-8 के 3-बाइट से अधिक की आवश्यकता होती है), तो आपको या तो VARBINARY
कॉलम प्रकार के स्वाद का उपयोग करना होगा या utf8mb4
वर्ण सेट का उपयोग करना होगा (जिसके लिए MySQL 5.5.3 या बाद के संस्करण की आवश्यकता है)। बस इस बात का ध्यान रखें कि utf8
MySQL में सेट किए गए वर्ण का उपयोग करना 100% समय तक काम नहीं करेगा।
अपाचे के साथ टॉम्केट
एक और बात यदि आप Apache + Tomcat + mod_JK कनेक्टर का उपयोग कर रहे हैं तो आपको निम्न बदलाव करने की आवश्यकता है:
- 8009 कनेक्टर के लिए tomcat server.xml फ़ाइल में URIEncoding = "UTF-8" जोड़ें, यह mod_JK कनेक्टर द्वारा उपयोग किया जाता है।
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8"/>
- अपने अपाचे फ़ोल्डर यानी गोटो
/etc/httpd/conf
और जोड़ने AddDefaultCharset utf-8
में httpd.conf file
। नोट: पहले जांच लें कि यह मौजूद है या नहीं। यदि मौजूद है तो आप इसे इस लाइन के साथ अपडेट कर सकते हैं। आप इस पंक्ति को नीचे भी जोड़ सकते हैं।