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.

SEO, anlamlı url ve bizim proje

Web 2.0 kavramı çıktığından bu yana web sitelerininde yapım aşamasından sunum aşamasına birçok şey değişti. Artık günümüzün popüler arama motorlarında üst sıralarda çıkmanın önemi bir hayli artmış durumda. Çünkü bizim ile aynı içeriği veren bir çok site var ve bunların her biri bizim rakiplerimiz. Bizim izlenimlerimize göre site ziyaretçilerin %50 - %60 kadarı arama sitelerinden yaptıkları arama sonucu internet sitesine ulaşıyor. Bu da çok ciddi bir rakam olduğu için son zamanlarda neredeyse yeni bir iş kolu olan SEO (Search Engine Optimizition) diye bir kavram oluşmuş oldu. Kısaca SEO sitenizin içeriğini arama motorlarında kolayca bulunacak şekilde revize edilmesine diyebiliriz. Yada baştan SEO kurallarına göre tasarlanması.

Bu kavram ile beraber birtakım yöntemler ortaya çıkmış oldu. Bazı yöntemler arama motorları kriterlerine kurallarına uygun, bazıları değil, bazıları ise taraflarca etik olup olmadığı hala tartışılan yöntemler. Fakat tartışmasız ve arama motorlarının çok sevdiği bir yöntem var ki o da "anlamlı url" dir.

Nedir Anlamlı Url?


İnternet sitemizdeki her bir sayfamız ve ya içeriği sunduğumuz alt sayfalarımıza linkler veririz, geçişler sağlarız. Bu sayfaların isimleri içeriği kısaca özetler nitelikte olması arama motorlarında o sayfanın daha rahat arşivlenmesini sağlar. Böylelikle o sayfamızın içeriği arama sayfalarında üst sıralarda çıkma şansını yakalamış olur. Anlamlı Url hakkında bu yazıyı okumanızı tavsiye ederiz. Biz okuduk oradan biliyoruz =)

Örnek
http://elemanlar.blogspot.com/?yil=2005&ay=05&konuID=4668

http://elemanlar.blogspot.com/2007/05/projeyi-takip-edebilmek.html

bu iki bağlantının aynı içeriği sunan iki farklı site olduğunuzu farzedersek ikinci link arama motorlarında daha anlaşılır ve tercih edilir olacaktır. Bunun yanında bir internet kullanıcısı arama motoruna "proje takip", "projeyi takip etmek" vb bir kelime parçacığı yazdığında, arama motoru yüksek ihtimal ile ikinci sitenin içeriğini gösterecektir.

Anlamlı Url nasil yapabilirim?


ASP için bir kaç alternatif var sanırım (IIS Mod Rewrite(ücretli), isapi rewrite) Birde Metin Aksu'nun olaya farklı bir yöntemi var inceleyebilirsiniz.
PHP için bu iş daha kolay sunucu üzerinde .htaccess dosyası oluşturup burada pattern (desenler) belirleyerek anlamlı url oluşturabilirsiniz.
JSP sayfaları için ise urlRewriteFilter var. Ve biz projemizde bunu kullanıyoruz. Temel olarak bir xml dosyasında url desenlerini oluşturuyorsunuz. urlRewriteFilter sunucuya gelen tüm istekleri kendi filtresinden geçiriyor ve xml e kaydedilmiş desenlere uyup uymadığına bakıyor. Uyan bir desen yok ise 4 0 4 hata sayfasını basıyor.

Projeyi Takip Edebilmek

Bizim ya da başka bir yerde başka kişiler tarafından geliştirilen projelerin ortak sorunudur, projenin ne durumda aşamada olduğunu takip edebilmek. Bu bir proje için hayati derecede önemli bir takip sürecidir ve en temel seviyede de olsa üzerine düşülmesi gereken bir konudur. Piyasada bir çok proje takip programı var. Bunların populerliği bizce işlevselliği ile doğru orantılı.

Biz projemizi basecamp üzerinden takip ediyoruz. Birbirimize to-do listler hazırlıyor, milestone (kilometre taşları) belirliyor, bir konu üzerinde teknik anlamda tartışmalar gerçekleştiriyoruz.

Basecamp 1 projeye kadar kısıtlı özellikleri ile ücretsiz hizmet veriyor. Kısıtlamalara ya da bir hesap üzerinden ikinci bir projeyi takip etmek istediğinizde ise ücret bekliyor sizden. Bizce parayı hakeden bir sistem ama tek projemiz var yeterli =)

Ücretsiz ve adını duyurmuş PHP tabanlı bir diğer proje takip sistemi ise activeCollab. Söylenenlere göre epey başarılı imiş fakat deneme fırsatım olmadı malesef. Fakat sitesinden incelediğim kadarı ile gayet iddialı ve sağlam durduğunu söyleyebilirim.


Projenin durumu Çok az, biraz değişiklik ile var olan modüllerde iyileştirme yaptım. dirtyThink bütün hafta sonu yattı, yok piknik dedi, yok stress atalım dedi yine kaçamak yaptı ama benden ilerde kendi işlerinde o yüzden susuyorum.

Proje Araç Gereçleri

Projeyi geliştirmekte kullandığımız faydalandığımız araçlar oluyor. Bunların başında geliştirme ortamı olarak Eclipse SDK 3.2 (aşığıyız) tercih ettik. Uygulamamız bir web projesi olduğu için web server a ihtiyacımız vardı. Bu alandaki tercihimizi de Tomcat5.5 ten yana kullandık. Yola çıktığımızda JDK 1.5.x son versiyonu vardı. (JDK 6.0 çıktı.) 1.4 e göre bizi sevindiren çok özelliği var. dirtyThink (yazılımcı) dünkü "Projedeki Teknolojileri Seçerken" başlığında database i belirtmediğimi söyledi kendisine selam ediyorum. mySQL 4.1 (5.0 ı da var) kullanıyoruz.

Genelde projemizi yanyana oturarak geliştirsekte bazı zamanlar uzaktan çalışma durumlarımız oluyor. Birbirimizin hangi proje dosyalarına etkidiğimizden haberdar olması için bir versiyonlama programına ihtiyacımız olduğuna karar vermiştik. CVSnt - SVN önümüzdeki alternatiflerimizdi ve biz CVS i seçtik (kendisini çok severiz).

Birde Apache Struts 1.3 kullanıyoruz. Web projeleri için java tabanlı çok güzel bir framework.

Proje için neredeyse 1 haftadır iki satır kod yazamamış durumdayız :(. Hepimizin ayrı bir işi var ve mesai sonrasi bu işe zaman ayırmaya çalışıyoruz.

Projedeki Teknolojileri Seçerken

Projede kullanmakta olduğumuz teknolojiler, bildiklerimiz arasında en uygun olduğunu düşündüklerimizdir. Bu teknolojilerle ilgili gelişmeleri çeşitli blog yazarlarından takip etmekteyiz. Böylece hem güncel bilgiye ulaşabiliyoruz hem de bildiklerimizi güncel tutabiliyoruz.

Projenin arayüzünü geçerli html ve geçerli css ile kodluyoruz. Bu teknolojileri kullanırken bize ışık tutan blog yazarları (Hasan Yalçın, Fatih Hayrioğlu aklımıza ilk gelenler)

Server taraflı dil için asp, php, jsp ya da yeni trend olan ruby vardı. Bunlar arasında en deneyimli olduklarımız asp ve jsp/servlet'ti. Böylesine bir proje için nesne tabanlı programlamanın daha uygun olduğunu düşündüğümüz için jsp/servlet i seçtik. (Microsoft asp den desteğini zaten çekmişti)

Arayüzdeki bazı etkileşimler için Ajax ı da unutmuyoruz.

Merhaba dünya

Projemizin gelişimini bir blog üzerinden anlatma fikrini, kendi aramızda büyük heyecan ile karşıladık. Henüz gelişme aşamasında iken internete sunacağımız projenin, yine interneti kullananlar tarafından şekillendirilmesi oldukça güzel olacaktır diye düşündük.

Projemiz bitene kadar burada neler paylaşacağımızdan kısaca bahsetmek istiyorum.

  • Projemizi yaparken faydalandığımız kaynaklar, ( Bu, bazen bir makale olur bazen bir teknoloji.)
  • Projemizde olmasını istediği(m/n)iz özellikler,
  • Zaman içerisinde projeye eklediğimiz - çıkardığımız özelliklerin tanıtımı.
Aktaracağımız konuların zaman sıralamasını projenin bitiş tarihine göre düzenlemeye çalışacağız. Yani halihazırda olmayan bir özellikten ya da olsa da diğer modüllere ihtiyaç duyabilecek bir özellikten bahsetmek istemiyoruz =)