Sıklıkla karşılaşılan bir probşem olduğu için benim kullandığım ve tüm içeriklerde başarıya ulaştığım yöntemi sizler ile paylaşmak istiyorum.

Günlük hayatımızda bir çok blog ve site sahibi botlardan yararlanmakta fakat farklı ve özel karakterli olan dilleri içeren sitelerdeki verileri çekerken çoğumuz anlamsız karakterler ile karşılaşıyoruz. Bunun kalıcı çözümü aşağıdadır...

CURL veya file_get_contents metodunu anlatacağım

$adres = "http://haberler.com/";
$icerik = file_get_contents($adres);
//yukarıda file_get_contents metodu ile içeriğini çekeceğimiz siteyi belirledik

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $adres);
curl_setopt($curl, CURLOPT_HEADER, TRUE);
curl_setopt($curl, CURLOPT_VERBOSE, FALSE);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($curl, CURLOPT_NOBODY, FALSE);
curl_setopt($curl, CURLOPT_REFERER,"");
$icerik = curl_exec($curl);
curl_close($curl);

//yukarıda da curl metodunu belirledik. İster file_get_contents isterseniz curl metdonu kullanabilirsiniz tabiki botunuzun ve serverinizin durumuna göre.

preg_match("''si",$adres, $karakter_seti);
//yukarıdaki kod ile karakter setini öğreniyoruz bunun için karakter setini preg_match ile parçalara böldük. Soru işaretli alanlar değişkenlerdir. Bu alanlara soru işareti katmamızdaki amaç; bazı sitelerde bu alanlara farklı tanımlar gelebilmektedir... Bu nedenle bizler her site için farklı tanımlar üretmemize gerek kalmamış olacak. Ve her sitenin karakter seti ne ise onu öğrenmiş olacağız...

$karakter_seti = $karakter_seti[3];
//yukarıdaki kod bizlere karakter seti değerini veriyor. [3] bu kutucuğa 3 yazmamızdaki amaç bize lazım olan karakter seti değeri 3. soru işaretli olan bölümdedir bu nedenle de [] kutucuk içine 3 yazdık ve karakter seti değerini öğrenmiş olduk.

$icerik = "ŞşŞŞŞÇçÖğĞCüÜİıö";
//veriyi çekeceğimiz sitedeki içerikte yukarıdaki gibi özel karakter var ise ve çekeceğimiz sitenin karakter seti windows-1254 yani türkçe karakter setli ise ve bizim sitemiz utf-8 ile kodlanmış ise veriyi çekerken karakterler şu şekilkde görünecektir: ŞşŞŞŞÇçÖğĞCüÜİıö işte bu sorunu aşağıdaki yöntem ile düzelteceğiz;

if($karakter_seti == "UTF-8" || $karakter_seti == "utf8" || $karakter_seti == "utf-8" || $karakter_seti == "") {
//yukarıdaki kod ile siteden çekmiş olduğumuz karakter kodunu sorguladık. Eğerki sitedeki karakter kodu utf-8 veya boş ise işleme olduğu gibi devam etmesini söyledik. Karakter kodlaması değeri boş ise bu yöntemi genelde mysql set character set utf8 kullanan siteler veya ingilizce olan siteler kullanmaktadır. Çünkü ingilizce de özel karakter hatası meydana gelmemektedir bu nedenle bir çok ingilizce sitede karakter kodu değeri yoktur bu nedenle bizde eğer karakter kodu değeri boş ise olduğu gibi işleme devam etmesini söyledik...

$duzenlenmis_icerik = $icerik;
//karakter kodlaması utf-8 ise içeriği olduğu gibi ekletebiliriz
} else {
//eğer karakter kodlaması utf-8 den farklı ise

$duzenlenmis_icerik = mb_convert_encoding($icerik, 'UTF-8', $karakter_seti);
//eğerki içeriğini çekeceğimiz sitenin karakter kodu utf-8'den farklı ise, $icerik ile tanımladığımız veriyinin karakterlerini UTF-8'e çevirmiş olduk. Böylelikle karakter hatası alma olasılığını minimum düzeye indirgemiş olduk.

}
?>


Yukarıdaki yöntemi kendi botlarınıza rahatlıkla uygulayabilirsiniz... Böylelikle tüm sitelerden karakter kodu hatası olmadan verileri çekebilirsiniz...

Şimdilik başka derslerde görüşmek üzere. Kuramayanlar olursa yorumlarda yardım isteyebilirler...

Saygılarım ile...