Nasıl UTF-8 Java web uygulamalarını çalışma almak için?
UTF-8 Java benim web uygulaması içinde çalışan almak istiyorum sunucu uygulamalarını JSP, hiçbir çerçeve kullanılan () äöå
vb destek için. özel durumlar için bir Fince metin ve Kiril alfabesi normal gibi ЦжФ
.
Benim Kur ÅŸudur:
- Geliştirme ortamı: Windows XP
- Üretim ortamı: Debian
Veritabanı: MySQL 5.x
Kullanıcılar ağırlıklı olarak Firefox2 kullanmak değil, aynı zamanda 9 Opera.x, FF3 7 ve Google Chrome sitesine erişmek için kullanılır.
Nasıl bunu başarmak için?
CEVAP
Bu sitenin SSS olarak kendimi cevap teşvik eder. Bu benim için çalışıyor:
Çoğunlukla karakterler äåö web uygulamalarını latin1 ıe varsayılan tarayıcı tarafından kullanılan karakter kümesi olarak sorunlu ve tomcat/java değildir. -8859-1, ISO olan "bu karakterleri anlar.
UTF-8 Java Tomcat Linux/Windows Mysql altında çalışan almak için aşağıdaki gerektirir:
Tomcat yapılandırma server.xml
Gerekli bağlayıcı UTF-8 (istek) url parametreleri kodlamak için kullandığı yapılandırmak için:
<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"
/>
Önemli bir parçası olmak="UTF-8" . URİEncoding ^/b>yukarıdaki örnekte. Bu Tomcat UTF-8 olarak gelen tüm parametreleri ALMAK kodlanmış işleyen garantileri. Kullanıcı, tarayıcısının adres çubuğuna aşağıdaki yazdığında sonuç olarak:
https://localhost:8443/ID/Users?action=search&name=*ж*
karakter ж UTF-8 olarak ele alınır ve kodlanmış (genelde hatta sunucu almadan önce tarayıcı tarafından)ж.
. ben^>POST isteÄŸi bundan etkilenmez.
CharsetFilter
Java Web uygulaması tüm istekleri işlemek için güç zamanı ve UTF-8 olarak kodlanmış tepkiler. Bu aşağıdaki gibi bir karakter kümesi filtresi tanımlamak gerekir:
package fi.foo.filters;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
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 eğer tarayıcı kodlama istekte kullanılan set bulmazlarsa, bu UTF-8'e ayarlı olduğundan emin yapar.
Başka bir şey bu filtre tarafından yapılan varsayılan yanıt yani kodlama ayarlamak için. bu kodlama içinde ne varsa html/döndü. Alternatif yanıt vb kodlama ayarlamak için. her uygulama denetleyicisi.
Bu filtre eklenecekweb.xmlveya web dağıtım tanımlayıcısı:
<!--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 filtre yapımı hakkında bilgi tomcat wiki (http://wiki.apache.org/tomcat/Tomcat/UTF-8) bulundu
JSP sayfası kodlama
Senin içindeweb.xmlaş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, JSP sayfaları " web-tüm bunların üstüne aşağıdaki olması gerekir:
<%@page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%>
Eğer JSP-parçaları farklı bir düzen bir çeşit kullanılırsa, o zaman bu gereklidirtümonlardan.
HTML-meta etiketleri
JSP sayfası kodlama, doğru kodlama JSP sayfasında karakterleri işlemek için JVM söyler. Sonra html sayfası kodlama olduğu vrowser söylemenin zamanı geldi:
Bu her xhtml Sayfa Web tarafından üretilen üst: aşağıdaki ile 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' />
...
Yerli mal-bağlantı
Bir db kullanarak, bağlantı UTF-8 kodlaması kullanan tanımlı olmalı. Bu yapılırcontext.xmlya da başka bir yerde BULUNMAKTAYDI bağlantı aşağıdaki gibidir: 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&characterEncoding=UTF-8"
/>
MySQL veritabanı ve tablolar
Kullanılan veritabanı UTF-8 kodlaması kullanılmalıdır. Bu aşağıdaki ile veritabanı oluşturarak elde edilir:
CREATE DATABASE `ID_development`
/*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_swedish_ci */;
Sonra, tüm tabloları UTF-8 olması da 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;
Önemli bir parçası olmak=Utf8 KARAKTER kümesi.
MySQL sunucu yapılandırması
MySQL serveri da yapılandırılacak. Genellikle bu değiştirerek, Windows yapılırbenim.ını-dosya ve yapılandırarak Linuxbenim.CPT-dosya. O dosyalardaki tüm istemciler sunucuya bağlı varsayılan karakter seti olarak utf8 kullanan ve varsayılan sunucu tarafından kullanılan karakter seti de utf8 tanımlı olmalıdır.
[client]
port=3306
default-character-set=utf8
[mysql]
default-character-set=utf8
Mysql prosedürler ve fonksiyonlar
Bu da karakter belirlenmiş 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: UTF-8 latin1
Eğer tomcat tanımlanan zaman istek parametreleri UTF-8, şu OLSUN, bu istekleri doğru şekilde işlenir: kodlanır server.xml
https://localhost:8443/ID/Users?action=search&name=Petteri
https://localhost:8443/ID/Users?action=search&name=ж
ASCII karakterler aynı şekilde kodlanmış çünkü hem latin1 ve UTF-8, "Petteri" doğru. işlenir dize ile
Kiril karakter ж latin1 tam olarak anlaşılmış değildir. Tomcat UTF-8 olarak istek parametreleri işlemek için talimat çünkü bu karakter doğru olarak kodlarж.
Eğer ve ne zaman tarayıcılar talimat okuma sayfaları UTF-8 kodlaması (istek başlıkları ve html meta etiketi), en az 2/3 Firefox ve diğer tarayıcılar bu dönem tüm kodlamak karakteri kendileri gibiж.
Sonuçta adı ile tüm kullanıcılar "" ve ismi ile tüm kullanıcılar "ж" bulundu. Petteri olmasıdır
Ama äåö ne olacak?
HTTP-şartname varsayılan olarak latin1 URL olarak kodlanmış tanımlar. Bu firefox2, firefox3 vb olur. aşağıdaki kodlama
https://localhost:8443/ID/Users?action=search&name=*Päivi*
kodlanmış sürümü için
https://localhost:8443/ID/Users?action=search&name=*Päivi*
Latin1 karakteräkodlanmış olarak�.Sayfa//istek olsa bile her şeyi UTF-8 kullanmak için tanımlanır. Ä UTF-8 kodlu versiyonuä
Bu web uygulaması için oldukça imkansız olması sonucu correly isteği bazı karakterler latin1 kodlanmış olarak GET istekleri parametreleri işlemek ve UTF-8 ya da başkaları. Dikkat: isterse sayfayı UTF-8 olarak tanımlanan tarayıcıları tamamen UTF-8 formları tüm istek parametreleri kodlamak gibi iş SONRASI
Bir şeyler okumak için
Çok büyük bir sorun benim için cevap verdiğin için aşağıdaki yazarlar için teşekkür ederim:
- http://tagunov.tripod.com/i18n/i18n.html>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/
ÖNEMLİ NOT
mysql Basic Multilingual Plane 3-bayt kullanarak UTF-8 karakterlerini destekler. Eğer ihtiyacınız gitmek dışında (bazı harfler ihtiyaç fazlası 3-bayt UTF-8), sonra da sana ihtiyacı için kullandıkları bir lezzet VARBINARY
sütun türü veya kullanım utf8mb4
character set (gerektiren MySQL 5.5.3 veya daha sonra). Sadece utf8
MySQL karakter seti kullanarak zaman 0 işe yaramaz unutmayın.
Apache ile Tomcat
Bir şey daha, Eğer mod_JK bağlayıcı Apache Tomcat kullanıyorsanız o zaman da değişiklikler aşağıdaki:
- URİEncoding="UTF-8" 8009 bağlayıcı için tomcat server.xml dosyaya, mod_JK bağlayıcı. tarafından kullanılmaktadır Ekle
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8"/>
/etc/httpd/conf
yani apache klasörüne git vehttpd.conf file
35 *ekleyin.Not:Öncelikle mevcut ya da değil olup olmadığını kontrol edin. Eğer bu satır ile güncelleyebilirsiniz var. Altındaki bu satır da ekleyebilirsiniz.
Java Hashmap: Nasıl anahtar değerini a...
Nasıl YYYY-aa-GG HH geçerli saati alma...
Nasıl cross-origin resource sharing (C...
Nasıl RelativeLayout birleştirme ve he...
Sistem giriş almak için Nasıl.Java: ()...