Bu sitenin SSS'si olarak kendimi cevaplamak teşvik ediyor. Bu benim için çalışıyor:
Çoğu zaman äåö karakterleri tarayıcılar tarafından kullanılan varsayılan karakter kümesi ve webapps için tomcat / java latin1 yani sorunlu değildir. Bu karakterleri "anlayan" ISO-8859-1.
UTF-8'in Java + Tomcat + Linux / Windows + Mysql altında çalışmasını sağlamak için aşağıdakiler gerekir:
Tomcat'in server.xml dosyasını yapılandırma
Bağlayıcının url (GET isteği) parametrelerini kodlamak için UTF-8 kullanacağını yapılandırmak gerekir:
<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"
/>
Yukarıdaki örnekte anahtar kısım URIEncoding = "UTF-8" dir . Bu, Tomcat'in gelen tüm GET parametrelerini UTF-8 kodlu olarak işlemesini sağlar. Sonuç olarak, kullanıcı aşağıdakileri tarayıcının adres çubuğuna yazdığında:
https://localhost:8443/ID/Users?action=search&name=*ж*
ж karakteri UTF-8 olarak işlenir ve (genellikle sunucuya ulaşmadan önce tarayıcı tarafından) % D0% B6 olarak kodlanır .
POST isteği bundan etkilenmez.
CharsetFilter
Sonra java web uygulamasını UTF-8 kodlu olarak tüm istek ve yanıtları işlemeye zorlama zamanı. Bu, aşağıdaki gibi bir karakter kümesi filtresi tanımlamamızı gerektirir:
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() {
}
}
Bu filtre, tarayıcı istekte kullanılan kodlamayı ayarlamazsa UTF-8 olarak ayarlandığından emin olur.
Bu filtre tarafından yapılan diğer bir şey, varsayılan yanıt kodlamasını ayarlamaktır. döndürülen html / ne olursa olsun kodlama. Alternatif olarak, uygulamanın her denetleyicisinde yanıt kodlamasını vb. Ayarlamaktır.
Bu filtrenin web.xml dosyasına veya webapp'ın dağıtım tanımlayıcısına eklenmesi gerekir :
<!--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>
Bu filtreyi yapma talimatları tomcat wiki'de bulunur ( http://wiki.apache.org/tomcat/Tomcat/UTF-8 )
JSP sayfa kodlaması
Senin içinde Web.xml aşağıdakileri ekleyin:
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<page-encoding>UTF-8</page-encoding>
</jsp-property-group>
</jsp-config>
Alternatif olarak, web uygulamasının tüm JSP sayfalarında en üstte şunlar olması gerekir:
<%@page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%>
Farklı JSP parçalarına sahip bir tür düzen kullanılırsa, hepsinde bu gereklidir .
HTML-meta etiketleri
JSP sayfa kodlaması, JVM'ye JSP sayfasındaki karakterleri doğru kodlamada işlemesini söyler. Sonra tarayıcıya html sayfasını kodlamanın hangi zaman olduğunu söyleme zamanı:
Bu, webapp tarafından üretilen her xhtml sayfasının üstünde aşağıdakilerle yapılır:
<?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 bağlantı
Bir db kullanırken, bağlantının UTF-8 kodlaması kullandığı tanımlanmalıdır. Bu, context.xml dosyasında veya JDBC bağlantısının nerede olduğu her yerde aşağıdaki gibi yapılır:
<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 veritabanı ve tabloları
Kullanılan veritabanı UTF-8 kodlamasını kullanmalıdır. Bu, veritabanı aşağıdakilerle oluşturularak gerçekleştirilir:
CREATE DATABASE `ID_development`
/*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_swedish_ci */;
Daha sonra, tüm tabloların UTF-8'de olması gerekir:
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;
Anahtar kısım CHARSET = utf8 .
MySQL sunucu yapılandırması
MySQL sunucusu da yapılandırılmalıdır. Bu genellikle Windows'ta my.ini -dosyasını değiştirerek ve Linux'ta my.cnf -dosyasını yapılandırarak yapılır . Bu dosyalarda, sunucuya bağlı tüm istemcilerin varsayılan karakter kümesi olarak utf8 kullandıkları ve sunucu tarafından kullanılan varsayılan karakter kümesinin de utf8 olduğu tanımlanmalıdır.
[client]
port=3306
default-character-set=utf8
[mysql]
default-character-set=utf8
MySQL yordamları ve işlevleri
Bunların ayrıca karakter setinin tanımlanmış olması gerekir. Örneğin:
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 ;
GET istekleri: latin1 ve UTF-8
Tomcat'in server.xml dosyasında tanımlandığında ve GET istek parametrelerinin UTF-8'de kodlanmış olması durumunda, aşağıdaki GET istekleri doğru şekilde işlenir:
https://localhost:8443/ID/Users?action=search&name=Petteri
https://localhost:8443/ID/Users?action=search&name=ж
ASCII karakterleri hem latin1 hem de UTF-8 ile aynı şekilde kodlandığından, "Petteri" dizesi doğru şekilde işlenir.
Kiril karakteri ж latin1'de hiç anlaşılmadı. Tomcat'e istek parametrelerini UTF-8 olarak işlemesi talimatı verildiğinden, bu karakteri % D0% B6 olarak doğru şekilde kodlar .
Tarayıcılara UTF-8 kodlaması (istek üstbilgileri ve html meta etiketi ile) sayfaları okumaları talimat verilirse, en azından Firefox 2/3 ve diğer tarayıcıların tümü karakterin kendisini % D0% B6 olarak kodlar .
Sonuç olarak "Petteri" adında tüm kullanıcılar ve "ж" adında tüm kullanıcılar bulunur.
Peki ya äåö?
HTTP spesifikasyonu, varsayılan olarak URL'lerin latin1 olarak kodlandığını tanımlar. Bu, aşağıdakileri kodlayan firefox2, firefox3 vb. İle sonuçlanır.
https://localhost:8443/ID/Users?action=search&name=*Päivi*
kodlanmış versiyonda
https://localhost:8443/ID/Users?action=search&name=*P%E4ivi*
Latin1'de ä karakteri % E4 olarak kodlanır . Sayfa / istek / her şey UTF-8 kullanacak şekilde tanımlanmış olsa da . UTF-8 kodlu ä sürümü % C3% A4'tür
Bunun sonucu olarak, bazı uygulamalar latin1 ve diğerleri UTF-8'de kodlandığından, web uygulamasının GET isteklerindeki istek parametrelerini doğru bir şekilde işlemesi imkansızdır.
Uyarı: Sayfa UTF-8 olarak tanımlanmışsa, tarayıcılar UTF-8'deki formlardan tüm istek parametrelerini tamamen kodladığı için POST istekleri işe yarar
Okunacak şeyler
Sorunumun cevaplarını verdikleri için aşağıdaki yazarlar için çok teşekkür ederim:
- 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/
Önemli Not
mySQL3 baytlık UTF-8 karakterlerini kullanarak Temel Çok Dilli Düzlemi destekler . Bunun dışına çıkmanız gerekiyorsa (bazı alfabe için 3 bayttan fazla UTF-8 gerekir), VARBINARY
sütun tipi bir lezzet kullanmanız veya utf8mb4
karakter kümesini (MySQL 5.5.3 veya üstünü gerektirir) kullanmanız gerekir. Sadece MySQL'de utf8
karakter setini kullanmanın zamanın% 100'ünde çalışmayacağını unutmayın.
Tomcat Apache ile
Bir şey daha Apache + Tomcat + mod_JK bağlayıcısı kullanıyorsanız, aşağıdaki değişiklikleri de yapmanız gerekir:
- 8009 bağlayıcı için tomcat server.xml dosyasına URIEncoding = "UTF-8" ekleyin, mod_JK bağlayıcısı tarafından kullanılır.
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8"/>
- Apache klasörü yani Goto
/etc/httpd/conf
ve eklemek AddDefaultCharset utf-8
içinde httpd.conf file
. Not: Önce var olup olmadığını kontrol edin. Varsa, bu satırla güncelleyebilirsiniz. Bu satırı altına da ekleyebilirsiniz.