Nasıl UTF-8 Java web uygulamalarını çalışma almak için? | Netgez.com
SORU
26 EYLÃœL 2008, Cuma


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
26 EYLÃœL 2008, Cuma


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

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:

  1. 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"/>
  2. /etc/httpd/conf yani apache klasörüne git ve httpd.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.

Bunu PaylaÅŸ:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VÄ°DEO

Rastgele Yazarlar

  • Besnik Ibrahimi

    Besnik Ibrah

    27 Mart 2010
  • GavinMichaelBooth

    GavinMichael

    26 AÄžUSTOS 2006
  • VvCompHelpvV

    VvCompHelpvV

    4 EYLÃœL 2007