2012-05-25 41 views
18

Tengo un script php que llama a otra página web y escribe todo el html de la página y todo va bien, sin embargo, hay un problema de juego de caracteres. Mi codificación de archivo php es utf-8 y todos los demás archivos php funcionan bien (eso significa que no hay ningún problema con el servidor). ¿Qué es lo que falta en ese código y todas las letras españolas se ven raras? PD. Cuando escribí estas extrañas versiones originales de personajes en php, todas parecen precisas.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

"todas las letras españolas mirada extraña" no es un problema rizo. –

Respuesta

28

simple: Cuando se utiliza la encrespa codifica la cadena a utf-8 sólo tiene que decodificar ..

Description 

string utf8_decode (string $data) 

Esta función decodifica los datos, supone que UTF-8 codificado, a 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

Usted puede utilizar cabecera

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

y después de la cadena de decodificación

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

ha funcionado para mí

0

me estuviera recibiendo un archivo de Windows-1252 codificado a través de curvatura y la mb_detect_encoding(curl_exec($ch)); devolvió UTF-8. Intentó utf8_encode(curl_exec($ch)); y los caracteres eran correctos.

0

La mejor manera que he probado antes es usar urlencode(). Tenga en cuenta que no lo use para toda la url. Úselo solo para las partes que necesita, p. para los personajes persas Sin embargo, hay formas mejores si el rango de caracteres que desea codificar es más limitado. Una de estas maneras es utilizar CURLOPT_ENCODING, pasando a otro curl_setopt():

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