2012-05-25 22 views
18

Mam skrypt php, który wywołuje inną stronę internetową i zapisuje cały HTML strony i wszystko idzie dobrze, ale jest problem z zestawem znaków. Moje kodowanie pliku php to utf-8 i wszystkie inne pliki php działają poprawnie (co oznacza, że ​​nie ma problemu z serwerem). Co jest brakiem w tym kodzie i wszystkie hiszpańskie litery wyglądają dziwnie. PS. Kiedy napisałem te dziwne postacie oryginalne wersje do php, wszystkie wyglądają dokładnie.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

„wszystkich hiszpańskich litery wyglądają dziwnie” nie jest cURL problem. –

Odpowiedz

28

Proste: Podczas korzystania zwijają koduje ciąg do utf-8 wystarczy je zdekodować ..

Description 

string utf8_decode (string $data) 

Funkcja ta dekoduje dane, zakłada się UTF-8 zakodowane, aby ISO-8859-1.

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

można użyć nagłówka

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

i po dekodowania ciąg

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

To pracował dla mnie

0

ja ściągam z windows-1252 zakodowanego pliku za pomocą cURL a mb_detect_encoding(curl_exec($ch)); zwrócił kod UTF-8. Wypróbowałem utf8_encode(curl_exec($ch));, a znaki były poprawne.

0

Najlepszym sposobem, jaki próbowałem wcześniej, było użycie urlencode(). Pamiętaj, nie używaj go do całego adresu URL. Użyj go dla potrzebnych części, np. dla postaci perskich. Istnieją jednak lepsze sposoby, jeśli zakres znaków, które chcesz kodować, jest bardziej ograniczony. Jednym z tych sposobów jest użycie CURLOPT_ENCODING, przekazując do innego curl_setopt():

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