Ajax, Php ve MySQL Uygulamalarında Türkçe Karakter Sorunları

 bcakir
 8 Temmuz 2011

Merhaba arkadaşlar uygulama yaparken en çok karşılaştığım sorunun çözümünü sizlere anlatmak istiyorum. Bir uygulama yaparken Ajax ile Html arasında, Php ile Ajax arasında ve Php ile MySQL arasında olmak üzere üç farklı türde sorunla karşılaşırız. Çoğu kişi bu sorunlara değinmiş olmalarına rağmen hepsinin tek makalede toplandığı bir yazı bulunmuyor. Bu yazı ile üç tip sorunuda çözmüş olacağız. Şimdi teker teker sorunları inceleyelim.

1- Ajax ile Html: Ajax ile yapılan uygulamalarda veri çıktısı text/html içerik türüne göre gerçekleşmektedir. Çoğu yazıda bu text/xml olarak yer alıyor. text/xml olarak tanımladığımızda ise doğru çalışmıyor. Bu veri alış verişinde karakter tipini ISO-8859-9 veya UTF-8 olarak ayarladığımızda türkçe karakter sorunumuz ortadan kalkacaktır. Sayfamıza eklememiz gereken kod aşağıda yeralmaktadır.

<meta http-equiv="content-type" content="text/html; charset=iso-8859-9" />

2- Php ile Ajax: Burada ise yapmamız gereken iki şey vardır. Bunlardan ilki Php sayfamızda karakter setini türkçe olarak ayarlamak.  Bunu aşağıda yer alan kod ile yapabilirsiniz.

<?php header("Content-Type: text/html; charset=iso-8859-9"); ?>

İkincisi ise Ajax ile Php arasında yapılacak veri transferinde; veri Php’ye UTF-8 olarak gelir. Bunu biz tekrar türkçe karaktere çevirmemiz gerekiyor. Yani karakter setini UTF-8‘den ISO-8859-9‘a çevireceğiz. Bunu da aşağıdaki kod ile yapabilirsiniz. Fakat burada birşey eklemek istiyorum tecrübelerime dayanarak. Bazı serverlarda buna gerek kalmıyor. Evde yaptığım uygulamamda localhosta çevirme işlemi yapmam gerekirken bunu servera attığımda hatalı çalıştı. Çevirme işlemini silince ise serverda da türkçe karakter problemi çözüldü. Kısaca söylemek istediğim çevirme işlemi yerine göre yapılması gerekir, yerine göre de yapılmayabilir.

<?php $turkceadres = iconv("UTF-8", "ISO-8859-9", $_POST['adres']); ?>

3- Php ile MySQL: Son olarak  Php ile MySQL arasındaki türkçe karakter sorununu da ele alıp yazımızı tamamlayalım. ISO-8859-9 türkçe karakter setine uygun MySQL karakter seti latin5_turkish_ci‘dir. Eğer UTF-8‘e göre bir uygulama yaparsanız karakter setini utf8_unicode_ci olarak ayarlamanız gerekir. Fakat ben bunu tavsiye etmiyorum çünkü UTF-8 türkçe karakter seti için değil bütün karakter setleri için yapılmıştır. MySQL’de alanlarımızın karakter setini latin5_turkish_ci olarak ayarladıktan sonra ise yapmamız gereken MySQL’den veri çekerken ve kaydederken MySQL’e karakter seti türkçe olarak veri almak istiyorum veya türkçe karakter setine sahip veri kaydetmek istiyorum demektir. Bu işlemi her veri alışımızda veya kaydedişimizde yapmamız gerekir. Eğer yazdırdığımız bilgiler MySQL’e doğru olarak kaydediliyorsa, yani türkçe karakterler database alanlarında doğru olarak çıkıyorsa programımız doğru çalışıyor demektir. Veri kaydetme ve alma için örnek kod aşağıda yer almaktadır.

<?php
//veri alırken
mysql_query("SET NAMES 'latin5'");
mysql_query("SET CHARACTER SET latin5");
mysql_query("SET COLLATION_CONNECTION = 'latin5_turkish_ci'");
$result = mysql_query("SELECT adi, soyadi FROM kullanici Where id='{$id}'", $connection);

//veri kaydederken
$query = "INSERT INTO kullanici (adi, soyadi) VALUES ('{$adi}', '{$soyadi}')";
mysql_query("SET NAMES 'latin5'");
mysql_query("SET CHARACTER SET latin5");
mysql_query("SET COLLATION_CONNECTION = 'latin5_turkish_ci'");
$result = mysql_query($query, $connection); if (!$result){echo "Kayıt hatası";}
?>

Bu makalede türkçe karakter problemi ile ilgili karşımıza çıkabilecek sorunları inceledik. Takıldığınız konularda yorum yazarak soru sormayı ihmal etmeyin. İlerki makalelerde görşmek üzere.

 2.627 Okunma

Bu yazıya 12 yorum yapılmış.

  1. süper gerçekten makale, devamını da bekliyoruz bu tür yazılarının.

  2. genelde 2 sorunun çözümünü bir makalede bulmak mucize, sen hepsini birden vermişsin. teşekkürler 😀

  3. devamını bekliyoruz bu tür yazıların 😀

  4. güzel derleme olmuş emeğine sağlık

  5. güzel makale bütün problemlerin çözümü var

  6. sonunda bütün problemleri açıklayan biri çıktı

  7. Güzel paylaşım emeğine sağlık. Bu yazdıklarının hepsi JQuery için de doğrudur 😀

  8. Bu kadar şeye gerek yok utf8 yetiyor tekbaşına.Tabiki veritabanı charset ayarları da utf8 olmalı…

    • Bu senin görüşün. UTF-8 karakter setinde yaptığın uygulamada git bir veritabanında yazılan yazıları kontrol et. Hepsi karma karışık sembollerden oluşan bir veri. Eğer bu verilerin Türkçe olsun istiyorsan bunları yapmalısın.

  9. Yanlışın var okadar proje geliştirdim web sitesi kodladım ama 1 tanesinde bile dediğin gibi bir problemle karşılaşmadım bu problemle karşılaşmamak için yapılması gereken şeyleri aşağıda belirtiyorum.

    1- Kodlanan sayfaların karakter setlerini utf-8 bomsuz olarak ayarlanmalı.
    2- Siteni karakter seti ayarı aşağıdaki gibi olmalıdır:

    3- Oluşturulan veritabanı utf_8_general_ci olarak ayarlanmalı.
    4- Php bağlantısını gerçekleştirilen yere aşağıdaki kodlar eklenmeli:

    mysql_query(“SET NAMES ‘utf8′”);
    mysql_query(“SET CHARACTER SET utf8”);
    mysql_query(“SET COLLATION_CONNECTION=’utf8_general_ci'”);

    Buda phpmyadminden bir görüntü bak bakalım senin dediğin gibi bir bozukluk mevcutmu Türkçe karakterlerde: http://f1205.hizliresim.com/x/d/5s4f1.png

    • Burada senin yaptığınla benim yazdığım arasında bir fark göremiyorum. Birinde karakter seti Türkçe olarak, diğerinde ise UTF-8 olarak ayarlı. Yani demek istediğim işlem olarak senin yazdığınla, benim yazdığım aynı sayılır. Bundan dolayı da birbirlerine üstün bir yönleri yok. Yukarıda anlattığım nokta ise, eğer karakter setini veritabanı işleminden önce belirtmeseydin verilerinin Türkçe olarak kaydedilemeyeceğiydi. Bunu yapıyorsan zaten aynı işlemi yapmış oluyoruz bir yerde (sadece karakter koleksiyonlarımız farklı). Umarım anlatabilmişimdir.

  10. Sadece yazınızda iso-8859-9 diye belirlemeniz benim dikkatimi çekti. Bu şekilde yapılan projelerde çoklu dil desteği işin içine girdiği zaman (rusça,çince,arapça vs…) sitedeki karakterler bozuk olarak görünecektir ayrıca bazı php fonksiyonları sadece utf8 desteklemektedir ben bu yüzden açıklama yapma gereğinde bulundum. Çalışmalarınızda başarılar dilerim.

    Saygılarımla…

Yazı hakkında görüşlerinizi belirtmek istermisiniz?

Daha fazla Ajax, JQuery, MySQL, Php
Kapat