PHP Curl UTF-8 Charset

j'ai un script php qui appelle une autre page web et écrit tout le html de la page et tout va bien cependant il y a un problème de charset. Mon encodage de fichier php est utf-8 et tous les autres fichiers php fonctionnent correctement (cela signifie qu'il n'y a aucun problème avec le serveur). Quelle est la chose manquante dans ce code et toutes les lettres espagnoles semblent bizarres. PS. Quand j'ai écrit ces caractères étranges versions originales en php, ils ont tous l'air précis.

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);
21
demandé sur Bora Alp Arat 2012-05-26 01:11:43

6 réponses

Simple: Lorsque vous utilisez curl il encode la chaîne utf-8 vous avez juste besoin de les décoder..

Description

string utf8_decode ( string $data )

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

31
répondu julio 2012-11-22 16:08:23

Vous Pouvez utiliser l'en-tête

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

et après décodage de la chaîne

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

Il a travaillé pour moi

9
répondu amir rasabeh 2014-09-04 06:48:45
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
répondu Engin Zeybekoğlu 2013-11-21 11:56:06
$output = curl_exec($ch);
$result = iconv("Windows-1251", "UTF-8", $output);
2
répondu Taron 2018-01-01 13:57:21

La meilleure façon que j'ai essayé avant est d'utiliser urlencode(). Gardez à l'esprit, ne l'utilisez pas pour toute l'url. Utilisez-le Uniquement pour les parties dont vous avez besoin, par exemple pour les caractères persans. Cependant, il y a de meilleures façons si la plage de caractères que vous voulez Encoder est plus limitée. L'un de ces moyens est d'utiliser CURLOPT_ENCODING, en passant par curl_setopt():

curl_setopt($ch, CURLOPT_ENCODING, "");
1
répondu MAChitgarha 2018-05-30 11:30:50

je suis allé chercher un fichier codé windows-1252 via cURL et le mb_detect_encoding(curl_exec($ch)); retourné UTF-8. Essayé utf8_encode(curl_exec($ch)); et les caractères étaient corrects.

0
répondu michalzuber 2016-05-20 16:26:07