lostyazilim
tr.link

Curl veya file_get_contents İle Veri Çekerken Karekter Sorununa Kesin Çözüm

7 Mesajlar 4.657 Okunma
acebozum
tr.link

wordpress forum wordpress forum Üyeliği Durdurulmuş Banlı Kullanıcı
  • Üyelik 24.12.2013
  • Yaş/Cinsiyet 35 / E
  • Meslek Wordpress Uzmanı
  • Konum Adana
  • Ad Soyad O** Ö**
  • Mesajlar 57
  • Beğeniler 24 / 9
  • Ticaret 1, (%100)
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...
 

 

elektronikssl
webimgo

soulmy soulmy WM Aracı Kullanıcı
  • Üyelik 12.06.2012
  • Yaş/Cinsiyet 38 / E
  • Meslek Öğretmen
  • Konum Samsun
  • Ad Soyad O** Y**
  • Mesajlar 1722
  • Beğeniler 398 / 400
  • Ticaret 20, (%100)
preg_match("''si",$adres, $karakter_seti);bu kod her zaman işe yaramıyor ne yazıkki.

Misal html5 sitelerde

buradaki charset değerini bu regex ile çekemezsiniz.

Ayrıca çok nadir de olsa bazı sitelerde charset meta kodu hiç olmayabiliyor.
 

 

.

wordpress forum wordpress forum Üyeliği Durdurulmuş Banlı Kullanıcı
  • Üyelik 24.12.2013
  • Yaş/Cinsiyet 35 / E
  • Meslek Wordpress Uzmanı
  • Konum Adana
  • Ad Soyad O** Ö**
  • Mesajlar 57
  • Beğeniler 24 / 9
  • Ticaret 1, (%100)

soulmy adlı üyeden alıntı

preg_match("''si",$adres, $karakter_seti);bu kod her zaman işe yaramıyor ne yazıkki.

Misal html5 sitelerde

buradaki charset değerini bu regex ile çekemezsiniz.

Ayrıca çok nadir de olsa bazı sitelerde charset meta kodu hiç olmayabiliyor.


bu kod örnek bir kod benim kullandığımda tüm ihtimaller düşünülerek kodlandı. dediğiniz gibi html5 kodlamarda bu şekilde

bunu da genel manada şu şekilde elde edebiliriz;



function temizle($temizle) {
$temizle = preg_replace('"','', $temizle);
$temizle= preg_replace("'", '', $temizle);
$temizle = str_replace("?","",$temizle);
$temizle= str_replace('/',"",$temizle);
$temizle = preg_replace("<","",$temizle);
$temizle = preg_replace(">","",$temizle);
$temizle = preg_replace('\',"",$temizle);

return $temizle;
}


preg_match("'charset=(.*?)'si",$adres, $karakter_seti);

$karakter_seti = temizle($karakter_seti[1]);



bu yöntemle öğrenebiliriz genel anlamda. Fakat dediğiniz gibi nadir de olsa charset kodu sitelerde bulunmuyor bu genel manada anlattığım gibi ingilizce sitelerde olmuyor ki zaten onlardan veri çektiğimiz zaman karakter hatası oluşmuyor...
 

 

soulmy soulmy WM Aracı Kullanıcı
  • Üyelik 12.06.2012
  • Yaş/Cinsiyet 38 / E
  • Meslek Öğretmen
  • Konum Samsun
  • Ad Soyad O** Y**
  • Mesajlar 1722
  • Beğeniler 398 / 400
  • Ticaret 20, (%100)
Şimdi oldu işte :)
wordpress forum

kişi bu mesajı beğendi.

.
wmaraci
wmaraci

wordpress forum wordpress forum Üyeliği Durdurulmuş Banlı Kullanıcı
  • Üyelik 24.12.2013
  • Yaş/Cinsiyet 35 / E
  • Meslek Wordpress Uzmanı
  • Konum Adana
  • Ad Soyad O** Ö**
  • Mesajlar 57
  • Beğeniler 24 / 9
  • Ticaret 1, (%100)

soulmy adlı üyeden alıntı

Şimdi oldu işte :)


ben sadece genel anlamda yöntemi söyledim :) başkaları bu yöntemi daha da geliştirebilir bu hayal gücüne bağlı :)
soulmy

kişi bu mesajı beğendi.

Onur89TR Onur89TR Üyeliği Durdurulmuş Banlı Kullanıcı
  • Üyelik 04.12.2011
  • Yaş/Cinsiyet 35 / E
  • Meslek .
  • Konum İzmir
  • Ad Soyad ** **
  • Mesajlar 2376
  • Beğeniler 704 / 791
  • Ticaret 1, (%100)
Herkes UTF-8 BOM'suz olarak kodlasa ne güzel olacak. Bir site neden ASCII ile kodlanır ki? Anlamakta güçlük çekiyorum...
wordpress forum

kişi bu mesajı beğendi.

wordpress forum wordpress forum Üyeliği Durdurulmuş Banlı Kullanıcı
  • Üyelik 24.12.2013
  • Yaş/Cinsiyet 35 / E
  • Meslek Wordpress Uzmanı
  • Konum Adana
  • Ad Soyad O** Ö**
  • Mesajlar 57
  • Beğeniler 24 / 9
  • Ticaret 1, (%100)

Onur89TR adlı üyeden alıntı

Herkes UTF-8 BOM'suz olarak kodlasa ne güzel olacak. Bir site neden ASCII ile kodlanır ki? Anlamakta güçlük çekiyorum...


çoğu site kendi ülkelerine yönelik ve bu yüzden kendi ülkelerinin dil kodlarını kullanıyorlar ve bizim Türkiye'de bile bir çok büyük haber sitesi hala windows-1254 kullanıyor. UTF-8'e geçmemelerine bende anlam veremiyorum... Belki de uğraşmak istemiyorlardır :) Malum büyük ölçekteki database ile oynamak bayağı büyük bir risk ;) İçerik kayıpları yaşanabilir en ufak yanlışta...
 

 

wmaraci
wmaraci
Konuyu toplam 1 kişi okuyor. (0 kullanıcı ve 1 misafir)
Site Ayarları
  • Tema Seçeneği
  • Site Sesleri
  • Bildirimler
  • Özel Mesaj Al