UTF-8 Türkçe karakter problemi

Bir internet sitesinin en önemli öğesi içerik olduğuna göre, kullanıcılara sunduğumuz metinlerin doğru görüntülenmeside son derece önemli bir unsurdur. Ayrıca projemiz Türkçe olarak hazırlanıyor bu nedenle Türkçe karakterlerin sorunsuz gösterilmesi de ayrıca dikkat ettiğimiz bir durum. Çünkü ("ı, İ, ç, Ç, ğ, Ğ, ş, Ş, Ü, ü, ö, Ö") yerine kullanılan ("o,s,i,c,g") harfler bazı kelimelerde anlam karmaşasına yol açabiliyor ( öldü , oldu ). Normalde bu sorunun ortadan kalkması için çözüm basittir. html etiketlerinden biri olan <meta> karakter tanımlaması yapmak, istediğiniz karakter setini atamak yeterlidir.

<meta equiv="" type="" content="text/html; charset=utf-8">

Ancak sunucu taraflı uygulamalarda, sunucu tarafından gelen veriler için bu yeterli olmayabiliyor. Bizim projemizde de bunu yaşadık. Sayfa header bilgilerinde taşınan veriler için (form verileri vs.) atadığımız karakter seti işe yaramıyordu. Bizde Java nın JSP/Servlet in güzel imkanlarından faydalanıp bir RequestFilter yazdık.

Sistem basitçe şöyle işliyor. Bir JSP tabanlı web projesinin bir takım ayarlarını web.xml dosyasından ayarlayabilirsiniz. Bahsi geçen xml dosyasına projeniz için filtreler de ekleyebiliyorsunuz. (Birçok "java web projeleri" için hazırlanmış uygulamalar web.xml dosyasına bu tarz filtreler eklerler). Yazmış olduğumuz filtre basit olarak sunucuya gelen request i (talep) kendisinden geçiriyor ve her talep verisini sunucu tarafında atadığımız karakter setine göre filtreliyor.

Peki Filter ı nasıl projemize ekleriz?

Öncelikle yazmış olduğumuz filterin çalışması için bahsettiğimiz gibi web.xml dosyasına filter imizi tanıtmamız gerekiyor.
<filter>
<filter-name>requestEncodingFilter</filter-name>
<filter-class>org.elemanlar.filter.RequestEncodingFilter</filter-class>
<init-param>
<param-name>requestEncoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>

package org.elemanlar.filter;
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;

/*** @author bidi bidi**/

public class RequestEncodingFilter implements Filter {

private FilterConfig config;
private String encoding = "UTF-8";

public void destroy() {}

public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding(encoding);
chain.doFilter(request, response);
}

public void init(FilterConfig config) throws ServletException {
this.config = config;this.encoding = config.getInitParameter("requestEncoding");
}
}
Yaptığımız testler sonucu hiç bir karakter sekteye uğramadan gösterilmiştir. Biz de güzel Türkçemizi sorunsuzca sunabilecek olmanın mutluluğunu yaşamış olduk. Ben o kadar iyi kullanamasam da çok daha fazla hassasiyeti olanlar için ( okaliptus ) iyi bir gelişme oldu.

2 yorum:

dirtyThink dedi ki...

Bir başka Türkçe karakter sorunu daha nasıl çözülür. Aslında böyle şeyler benden başka kimsenin başına gelmez sanırım :)

Veritabanımız : Mysql 4.x
characterEncoding : latin5

Bağlantı türümüz : JNDI ConnectioPool

Gel gelelim bizim connection pool umuzun yediği naneye , bizim pool çektiğim kayıtarın Türkçe karakterlerini göstermiyor.

JSP sayfamın charset ini UTF-8 yapıyorum iso-8859-9 yapıyorum hiç beni tınlamıyor.

Fakat jsp sayfasında normal bir connection açıp verileri çektiğimde Türkçe karakterlerde hiç bir sorun gözükmüyordu.

Normal Connection için URL:
jdbc:mysql://127.0.0.1:3306/test?user=root&password=root&characterEncoding=latin5&useUnicode=true

---
Fakat Connection Pool için uluşturduğum propertylerde farklı bişeyler yoktu.

Url:jdbc:mysql://127.0.0.1:3306/test?characterEncoding=latin5&useUnicode=true
user=root
password=root

bu Properties adlarını ve değerlerini kullanınca bağlanıyor fakat Türkçe karakterlerde patlıyordu.

Ne yazık ki ?characterEncoding=latin5&useUnicode=true Property lerini ayrı ayrı yazmak gerekiyormuş.

Fakat daha önce çalışıyordu bu :(

elemanlar dedi ki...

Buraya uğramayalı epey oldu diryThink ne yapıyorsun burada. Bütün miskinliğimiz üstümüzde bir silkinmemiz gerek. Bu yorum tarihi itirabi ile dün arayüz deki yorum kismini tamamladim. Şimdi tiles lar daki bölünmeleri kafamda oluşturmaya çalışıyorum. Nadas a biraktik ivme düşük mutlu değilim.