Ajax ile Karşılaşılacak Türkçe Karakter Sorununun Çözümleri

  • Konbuyu başlatan Konbuyu başlatan Z1rT
  • Başlangıç tarihi Başlangıç tarihi
9
EXE RANK

Z1rT

Fexe Kullanıcısı
Puanları 0
Çözümler 0
Katılım
26 Kas 2009
Mesajlar
9,190
Tepkime puanı
0
Puanları
0
Yaş
33
Web sitesi
www.netbilgini.net
Z1rT
Kolay gelsin arkadaşlar.Daha öncede düşündüğüm "çözümlerin toplu listesinin olması" gerçektende kolaylık sağlayacaktır.Ben 6 tane yol çıkarabildim çözüm için.Ama belki sizin bir tanesini yapmanız bile yetecektir.Benim karşılaştığım en ilginç sorun: "php" kullanırken header("content-type...") kullanırken daha önceki projede Türkçe karakter olayını çözüp dün denediğimde çözülmememesi.Nasıl olur diye sorarsanız bilmiyorum
smile.gif
Ama bu sorunun birden fazla çözümü olduğu kesindir.Toparlamaya çalıştım bunları."PHP" ile uğraştığım için header() komutunun asp,asp.net de veya herhangi bilr dilde karşılığını bilen arkadaşlar yazarlarsa güzel olur.

Adımlar şöyle

  1. Veritabanı karakter seti
  2. Dosya karakter seti
  3. Çıktı dosyasının(.html) karakter seti
  4. Ajax kütüphanesinin karakter setinin UTF-8 den ISO ya çevrilmesi
  5. Çıktı sayfasının karakter setinin script-dili ile belirlenmesi
  6. php-iconv çözümü
Aşağı yukarı böyle sıralanabilir.Adım adım anlatayım.

Adım 1:Veritabanı karakter setlerinden içinden Türkçe karakterler olanını seçmeniz önemli.utf8_turkish_ci,latin5_turkish_ci gibi.Bunun ardından Şu kısımda önemli asıl SQL cümlesini çalıştırmadan önce şu komutu çalıtırmanız lâzım ("set names latin5").latin5 yerine Türkçe karakter olan bir set de seçebilirsiniz.
Adım2:Üzerinde çalıştığınız dosyanın(index.php-index.asp) karakter setini değiştirebilirsiniz.Bunu için not defteri farklı kaydet ansi->utf-8 yapabilirsiniz.Ya da kullandığınız editörün karakter setini değiştirme özelliğini kullanabilirsiniz.Yalnız bu işlem sayfanızdaki Türkçe karakterlerin abulmasına sebep olacaktır.Ama sonuç olarak sorun çözülebilir.
Adım 3:Çıktı verdiğiniz sayfanın karakter setinde de sorun çıkmış olabilir.Bunu için ****** http-equiv="Content-Type" *********"text/html; charset=ISO-8859-9"/> yazmanız yeterlidir.
Adım 4:Daha dün öğrendiğim ama daha öncede gözüme çarpan xmlhttprequest nesnesinin setrequestheader özelliğini iso yapmanızdır.Bunun örneğini aşağıda vereceğim.Ajax'ın nasıl kullanıldığını anlatırken.
Adım 5:Çıktı dosyasının başlığını bir şekilde belirlemeniz önemli *********iso-8859-9.Bunu script-dili ilede yapabilirsiniz."PHP" de örneğini göstereyim.header("content-type:text/html; charset=iso-8859-9"); şeklinde halledebilirsiniz.Diğer dillerde arkadaşlar gösterirlerse gerçekten güzel olur.
Adım 6:Bu biraz spesifik kalabilir.Ama mantığını söyleyim ki diğer s-dilinde bilen arkadaşlar varsa not düşebilirler."PHP" ile bir metnin karakter kodlamasını değiştirebiliyoruz.bunu iconv ile yapabiliyoruz.Örnek olarak $metin=iconv("ISO-8859-9","UTF-8",$metin);

Bu adımların hepsini tabikide sırayla yapmak zorunlu değilsiniz.Önemli olan 4.adım ile 3.adımın kesinlikle bulunmasıdır.Bu ikisiyle çözüme ulaşabilirsiniz.Ama olurya benim çektiğim gibi çok ilginç sıkıntılar çekerseniz diğer adımlarada göz atabilirsiniz.

Ajax Örneklerine geçeyim.Özellikle 4.Adımı göstereyim.

PHP:
function ajax()
{
    var xmlHttp=null;
    try
    {
        // Firefox, Opera 8.0+, Safari
        xmlHttp=new XMLHttpRequest();
    }
    catch (e)
    {
        // Internet Explorer
        try
        {
            xmlHttp=new ActiveXObject('Msxml2.XMLHTTP');
        }
        catch (e)
        {
            xmlHttp=new ActiveXObject('Microsoft.XMLHTTP');
        }
    }
    return xmlHttp;
}
function hazirla()
{
      xmlHttp=ajax();
      if (xmlHttp==null)
      {
        alert ('Tarayıcınız Ajax Desteklemiyor!');
        return;
    }
    var baslik = document.getElementById('haber_baslik').value;
    var icerik = document.getElementById('haber_icerik').value;
    var url='haber_ekle.php';
    var sc ='haber_baslik='+baslik+'&haber_icerik='+icerik;
    xmlHttp.open('POST', url, true);
    xmlHttp.setRequestHeader('If-Modified-Since', 'Sat, 1 Jan 2000 00:00:00 GMT');
    xmlHttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded; charset=iso-8859-9');
    xmlHttp.setRequestHeader('Content-length', sc.length);
    xmlHttp.setRequestHeader('Connection', 'close');
    xmlHttp.onreadystatechange=Guncelle;
    xmlHttp.send(sc);
 
}
function Guncelle()
{
    if (xmlHttp.readyState==4 && xmlHttp.status == 200)
    {
        document.getElementById('sonuc').innerHTML=xmlHttp.responseText;
    }
}
/////////////////////ÜSTTEKİ KISIM POST İŞLEMİ YAPAR

Bu kısım POST işlemi içindir.Mantığını anlatayım ajax() fonksiyonu ile xmlhttprequest nesnesi oluşturuyoruz.Bu kadar uzun olmasının sebebi.IE nin kılçıklık yapmasıdır.hazirla() fonksiyonu ile xmlhttprequest nesnemizin içeriğini hazırlıyoruz.İşte burda sahneye şu komut çıkıyor xmlHttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded; charset=iso-8859-9'); bununla ajax karakter seti belirliyoruz.Ve xmlhttp.send(sc) ile veriyi gönderiyoruz.Gönderdik tamam ama bunu kontrölü lâzım bunuda Guncelle() fonksiyonu ile yapıyoruz.Ve sonuc id li spanı veya divi güncelliyoruz.Bunların çalışması için ilk başta
ajax() fonksiyonu çalıştırıyoruz xmlhttp hazırlanmış oluyor ve haber ekleme işlemini tetikliyoruz haber_ekle() ile.Birde xmlhttprequest in durumunu readyState ile alabiliyoruz."4" bütün verinin aktarıldığını söylüyor bizde "4" e göre işlem yapıyoruz.GET metduda aynı mantıkla çalışır ondan onu geçiyorum ama kodları budur:

PHP:
function requestOlustur()
{
    var conn;
    var browser = navigator.appName;
    if(browser == "Microsoft Internet Explorer")
    {
        conn = new ActiveXObject("Microsoft.XMLHTTP");
    }
    else
    {
        conn = new XMLHttpRequest();
    }
    return conn;
}
function requestGonder(kadi,sifre,oturum)
{
    gonderilecekler='ana_sayfa.php?yontem=ajax&kadi='+kadi+'&sifre='+sifre+'&oturum='+oturum;
    http.open('get', gonderilecekler);
    Http.setRequestHeader('Content-Type','application/x-www-form-urlencoded; charset=iso-8859-9');
    http.onreadystatechange = handleResponse;
    http.send(null);
}
function handleResponse()
{
    if(http.readyState == 4)
    {
        var response = http.responseText;
        document.getElementById('bilgi').innerHTML = http.responseText;
        if(http.responseText=='0'){
            document.getElementById('bilgi').innerHTML = 'Girdiğiniz Kullanıcı adı veya Şifre yanlış';
        }else{
            document.getElementById('bilgi').innerHTML = 'Hoş Geldin '+http.responseText;
            yonbasla();
        }
    }
}
 
///ÜSTTEKİ AJAX GET METODUDUR

Ve Sırada Jquery var bu kod yığınından sonra size bir ferahlık getirecek.Jquery süper bir Framework dür.Kullanımı tavsiye ederim.Javascript öğrenmeye getElementById ile başladıktan sonra(temel değişkenleri ve bilgileri bildiğimizi varsayarak) jquery ye geçiş yapabiliriz.
Jquery ile de şöyledir.
PHP:
var veri="kullanici=mrsb&sifre=44&degisken=varsa daha böyle böyle ekliyoruz";
var ajax_url="mesela.php";
$.ajax({
        data: veri,
        type: "POST",
        url: ajax_url,
        timeout: 20000,
        contentType: "application/x-www-form-urlencoded;charset=ISO-8859-9",
        success: function(e){//Buraya kod gelecek}
});
ÜSTTEKİ JQUERY POST VEYA GET METODU İÇİN GEÇERLİDİR.

success - bizim 4 e karşılık geliyor az çok hata oluşmaz da her şey doğru çalışırsa çalışıyor.Eğer hata olursa error çalışıyor.
Bunu <script type="text/javascript" src="jquerydosyasınınyeri.js"></script>
şeklinde kütüphaneyi eklemeniz karşılığında kullanabilirsiniz.Bunuda Burdan temin edebilirsiniz.Ve ayrıca jquery ile ilgilenmek isterseniz Burdan başlayabilirsiniz. Sol kısımdaki menüden effects e girip ordaki .show() methoduna bakabilirsiniz.Zaten nasıl çalıştığını biraz aşağı inince anlatıyor.Örneklerine bakabiliyorsunuz.

Gerçekten biraz uzun olmuş.Ama koskoca Ajax için az bile.Bu aralar ciddi ciddi moda olmuş.Ama sayfayı şenlendirdiği kesindir.İnşallah bundan sonraki arkadaşların bu kısımda sorun yaşamayıp enerjilerini daha dinamik bir sayfa için harcalar.Ve Ajax'a başlamadan bıkma olayınıda kapatmış oluruz.

Bir yöntem daha ekleyim.Karakter kodlamalarının hepsini utf-8 den yana kullanırsanız o zaman da sorunsuz bir yapı elde edebilirisiniz.

  1. MYSQL Karşılaştırmanız:utf8_turkish_ci
  2. Tüm kullandığınız dosyalarınızın kodlaması utf-8.Bunu için ben Aptana nın "Set encoding" seçeneğini kullanıyorum.
  3. Bundan sonra Veritabanında herhangi bir kodu çalıştırmadan önce "set names utf8" kodunu çalıştırıyorum.
  4. Ardından çıktı sayfam'ında(.html) karakter kodlamasını utf-8 yaptıktan sonra artık hiç bir sorunumuz kalmıyor.
Görüldüğü üzere her şeyin kodlaması utf olduğu için artık sorunumuz kalmıyor.Fakat siz yine de "iso" seçebilirsiniz ama bu sefer arada karakter dönüşümleri gerekiyor.iconv gibi mesela.Yoksa karakterler çok değişik şekillere bürünüyorlar.Ne yapalım artık standartlaşmış utf-8.Hatta Opera'nın Unite uygulamalarının içindeki "web proxy" bile utf-8 kullanıyor benim "iso" kodlamalı karakterlerim burda başka şekillere bürünüyorlar.

Ayrıca benim hazırladığım bir küçük ajax uygulaması var.Onuda indirerek inceleyebilirsiniz.Firefox 3.6.11 Opera 9.63 ve ie 6+ larda sorunsuz çalışıyor.Harici hatalarla uğraşmadan işlemlere kulak verebilirsiniz.

Döküman ommd'a aittir.
 
Merhaba gardaşım. Kaderin cilvesi ya yine aynı konuyu google'da aratıyordum. Jquery ile ajax kullanıyorum şimdi. Ve benim çok önceden yazdığım dökümanın baş kısmını google'ın ön sayfalarında gördüm. Sonra siteye baktım forum.ceviz'den başka url. Dedim yazdığım şey maşallah bayağı yayılmış. Kimse şu nalet Türkçe karakter problemine takılmadan js kullanmaya devam etsin diye tüm birikimleri birleştirmiştim dökümanda elbette ama keşke altına küçükte olsa dipnot düşseydin ommd tarafından yazılmıştır felan diye. Çok makbule geçerdi :)
 
Merhaba gardaşım. Kaderin cilvesi ya yine aynı konuyu google'da aratıyordum. Jquery ile ajax kullanıyorum şimdi. Ve benim çok önceden yazdığım dökümanın baş kısmını google'ın ön sayfalarında gördüm. Sonra siteye baktım forum.ceviz'den başka url. Dedim yazdığım şey maşallah bayağı yayılmış. Kimse şu nalet Türkçe karakter problemine takılmadan js kullanmaya devam etsin diye tüm birikimleri birleştirmiştim dökümanda elbette ama keşke altına küçükte olsa dipnot düşseydin ommd tarafından yazılmıştır felan diye. Çok makbule geçerdi :)
Anladım kardeşim ama alıntı yaptıgımız yerde senin olduguna dair yoktu ama ekliyorum.
 
Geri
Üst