web-dev-qa-db-fra.com

PHP Curl UTF-8 Charset

J'ai un script php qui appelle une autre page Web et écrit tout le code html de la page et tout se passe bien, mais il y a un problème de jeu de caractères. Mon encodage de fichier php est utf-8 et tous les autres fichiers php fonctionnent correctement (cela signifie qu’il n’ya aucun problème avec le serveur). Quelle est la chose qui manque dans ce code et toutes les lettres espagnoles ont l'air bizarre. PS. Lorsque j’ai écrit ces versions originales de ces personnages étranges en php, elles ont toutes l’air exactes.

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);
22
Bora Alp Arat

Simple: Lorsque vous utilisez curl, il code la chaîne en utf-8 il vous suffit de les décoder.

Description

string utf8_decode ( string $data )

Cette fonction décode les données, supposées être codées en UTF-8, en ISO-8859-1

31
julio

Vous pouvez utiliser l'en-tête 

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

et après décoder la chaîne

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

Ça a fonctionné pour moi

10
amir rasabeh
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;
}
3
Engin Zeybekoğlu
$output = curl_exec($ch);
$result = iconv("Windows-1251", "UTF-8", $output);
2
Taron

Le meilleur moyen que j'ai essayé auparavant est d'utiliser urlencode() . Gardez à l'esprit, ne l'utilisez pas pour une URL complète. Utilisez-le uniquement pour les pièces dont vous avez besoin, par exemple. pour les personnages persans. Cependant, il existe de meilleures méthodes si la plage de caractères que vous souhaitez encoder est plus limitée. L’une de ces méthodes consiste à utiliser CURLOPT_ENCODING en le passant à curl_setopt() :

curl_setopt($ch, CURLOPT_ENCODING, "");
1
MAChitgarha

Je cherchais un fichier encodé Windows-1252 via cURL et la mb_detect_encoding(curl_exec($ch)); renvoyait UTF-8. J'ai essayé utf8_encode(curl_exec($ch)); et les caractères étaient corrects.

0
michalzuber