20 Ocak 2013 Pazar

PHP ve Mysql Türkçe Karakter Sorunu

ADIM ADIM LATIN5 VE UTF-8 YÖNTEMLERİ

Select veya LIKE gibi komutları kullanarak MYSQL veritabanından bilgi çekerken, ÇĞİÖÜ çğıöü gibi harflerde hatalar çıkıyor. Bunun için en beğendiğim yöntemleri seçtim. Genelde 2 yöntem var. 1. yöntem LATIN5'i seçmek. 2. yöntem UTF-8'i seçmek. UTF-8 bütün dilleri kapsadığı için daha geçerli bi yöntem. Fakat ben ve forumlarda belirten bazı arkadaşlar bazen UTF-8'de her istediğimizi yapamadık. Bu nedenle uygulamanıza göre siz karar verebilirsiniz. İpucu olarak şunu söyleyebilirim. Eğer yapacağınız uygulama sadece TÜRKÇE olacak ve Facebook gibi başka dillere de hizmet vermeyecekse LATIN5'i seçebilirsiniz. Genel bi uygulamaysa UTF-8 daha uygundur.
Gelelim bu yöntemlere:
YÖNTEM 1 (LATİN5):
1- Mysql tablonuzun özelliklerinden karakter setini latin 5, karşılaştırmayı da latin5_turkish_ci olarak seçin. Sadece tabloyu ayarlamak yeterlidir. Ayrıca veritabanının yada tablo bileşenlerinin özelliklerini değiştirmeye gerek yoktur. Zaten bileşenler tablo değişince otomatik olarak latin5 olacaktır.
2-Php de sayfaların head kısımları arasına şu meta etiketini ekleyin:
meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-9">
3- Tablomuzu ve Sayfalarımızı latin5 olarak ayarladıktan sonra bir işlem kaldı. O da veritabanından veri çekerken de latin5 olarak çekmek. Bunun için şu kodu veri tabanı bağlantısından hemen sonraya ekleyin, yani şu şekilde:
?php
$baglan 
mysql_connect('localhost','user','pass',TRUE);
mysql_selectdb('db',
$baglan);
mysql_set_charset('latin5',
$baglan);
?>
Bu konuyu araştırdığınızda bu tek satırlık kodun bazı sitelerde 3 satır olarak verildiğini göreceksiniz fakat buna gerek yoktur, bu hali yeterli ve doğru kullanımdır (Bkz: php.net)
YÖNTEM 2 (UTF-8):
1- Mysql tablonuzun özelliklerinden karakter setini utf8, karşılaştırmayı da utf8_general_ci olarak seçin. Sadece tabloyu ayarlamak yeterlidir. Ayrıca veritabanının yada tablo bileşenlerinin özelliklerini değiştirmeye gerek yoktur. Zaten bileşenler tablo değişince otomatik olarak utf8 olacaktır.
2-Php de sayfaların head kısımları arasına şu meta etiketini ekleyin:
meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
3-Editörünüzde php dosyanızı kaydederken Kodlama kısmını utf-8 olarak seçin.
3- Tablomuzu ve Sayfalarımızı utf8 olarak ayarladıktan sonra bir işlem kaldı. O da veritabanından veri çekerken de utf8 olarak çekmek. Bunun için şu kodu veri tabanı bağlantısından hemen sonraya ekleyin, yani şu şekilde:
?php
$baglan 
mysql_connect('localhost','user','pass',TRUE);
mysql_selectdb('db',
$baglan);
mysql_set_charset('utf8',
$baglan);
?>
Bu konuyu araştırdığınızda bu tek satırlık kodun bazı sitelerde 3 satır olarak verildiğini göreceksiniz fakat buna gerek yoktur, bu hali yeterli ve doğru kullanımdır (Bkz: php.net)

TÜRKÇE KARAKTERLERİN HTML ve ASCII KARŞILIKLARIHTML KARŞILIKLARI:Ü <=> Ãœ
Ş <=> ÅŸ
Ğ <=> ÄŸ
Ç <=> Ç
İ <=> Ä°
Ö <=> Ö
ü <=> ü
ş <=> ÅŸ
ğ <=> ÄŸ
ç <=> ç
ı <=> ı
ö <=> ö
ASCII KARŞILIKLARI:
ç <=> & #231;
ı <=> & #305;
ğ <=> & #287;
ö <=> & #246;
ş <=> & #351;
ü <=> & #252;
Ç <=> & #199;
İ <=> & #304;
Ğ <=> & #208;
Ö <=> & #214;
Ş <=> & #350;
Ü <=> & #220;
ascii karakter tablosunun hepsi için tıklayın

Diyelimki herşeyi yaptınız ama yine de sayfalarınızda veritabanından çektiğiniz bilgiler bozuk çıkıyo. O zaman yukarıda verdiğim kodlar aracılığıyla PHP sayfalarınızda bazı replace fonksiyonlarını kullanarak bozuk çıkan karakterleri ekrana vermeden önce düzeltebilirsiniz. Kendi kullandığım örnek bi fonksiyon şöyle:
function karakter_tr($text)
{
$text = trim($text);
$search = array('Ð','Þ','Ý','Ä°');
$replace = array('Ğ','Ş','İ','İ');
$new_text = str_replace($search,$replace,$text);
return $new_text;
}
Bu fonksiyondaki $search ve $replace değişkenlerine aynı hizada olmak şartı ile istediğiniz karakteri ve html-ascii karşılığını ekleyebilirsiniz.