2012-05-25 13 views
18

Başka bir web sayfasını çağıran ve sayfanın tüm html'sini yazan bir php betiğim var ve her şey yolunda gidiyor, ancak bir charset problemi var. Benim php dosya kodlama utf-8 ve diğer tüm php dosyaları tamam (yani sunucu ile ilgili herhangi bir sorun yok demektir). Bu koddaki eksik şey nedir ve tüm ispanyolca harfler garip görünüyor. PS. Bu tuhaf karakterleri orijinal sürümlerini php'ye yazdığımda hepsi doğru görünüyor.PHP Curl UTF-8 Charset

header("Content-Type: text/html; charset=utf-8"); 
function file_get_contents_curl($url) 
{ 
    $ch=curl_init(); 
    curl_setopt($ch,CURLOPT_HEADER,0); 
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); 
    curl_setopt($ch,CURLOPT_URL,$url); 
    curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1); 
    $data=curl_exec($ch); 
    curl_close($ch); 
    return $data; 
} 
$html=file_get_contents_curl($_GET["u"]); 
$doc=new DOMDocument(); 
@$doc->loadHTML($html); 
+11

cURL sorun değil "tüm İspanyol harfler garip bak". –

cevap

28

Basit: bunu sadece onları deşifre gerekir utf-8 dize kodlar kıvrılıp kullandığınızda ..

Description 

string utf8_decode (string $data) 

Bu fonksiyon deşifre verileri UTF-8ISO-8859-1 için, kodlanmış olduğu kabul.

3
function page_title($val){ 
    include(dirname(__FILE__).'/simple_html_dom.php'); 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL,$val); 
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:25.0) Gecko/20100101 Firefox/25.0'); 
    curl_setopt($ch, CURLOPT_ENCODING , "gzip"); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_HEADER, 0); 
    $return = curl_exec($ch); 
    $encot = false; 
    $charset = curl_getinfo($ch, CURLINFO_CONTENT_TYPE); 

    curl_close($ch); 
    $html = str_get_html('"'.$return.'"'); 

    if(strpos($charset,'charset=') !== false) { 
     $c = str_replace("text/html; charset=","",$charset); 
     $encot = true; 
    } 
    else { 
     $lookat=$html->find('meta[http-equiv=Content-Type]',0); 
     $chrst = $lookat->content; 
     preg_match('/charset=(.+)/', $chrst, $found); 
     $p = trim($found[1]); 
     if(!empty($p) && $p != "") 
     { 
      $c = $p; 
      $encot = true; 
     } 
    } 
    $title = $html->find('title')[0]->innertext; 
    if($encot == true && $c != 'utf-8' && $c != 'UTF-8') $title = mb_convert_encoding($title,'UTF-8',$c); 

    return $title; 
} 
7

Sen başlık

header('Content-type: text/html; charset=UTF-8'); 

ve kod çözme dize sonra kullanabilir miyim

$page = utf8_decode(curl_exec($ch)); 

Beni

0

Ben cURL'den ve üzeri bir windows-1252 kodlu dosya getirilirken edilmiş çalıştı mb_detect_encoding(curl_exec($ch)); UTF-8'i döndürdü. utf8_encode(curl_exec($ch)); denendi ve karakterler doğruydu.

0

Daha önce denediğim en iyi yol urlencode()'u kullanmaktır. Unutmayın, tüm URL için kullanmayın. İhtiyacınız olan parçalar için kullanın, ör. Farsça karakterler için. Bununla birlikte, kodlamak istediğiniz karakter aralığının daha sınırlı olmasının daha iyi yolları vardır. Bu yollardan biri başka curl_setopt() için ileterek, CURLOPT_ENCODING kullanmaktır:

curl_setopt($ch, CURLOPT_ENCODING, ""); 
1
$output = curl_exec($ch); 
$result = iconv("Windows-1251", "UTF-8", $output);