web-dev-qa-db-ja.com

PHP Curl UTF-8 Charset

別のWebページを呼び出し、ページのすべてのhtmlを書き込むphpスクリプトがありますが、charsetの問題がありますが、すべて問題ありません。私のphpファイルのエンコーディングはutf-8であり、他のすべてのphpファイルは正常に機能します(つまり、サーバーに問題はありません)。そのコードに欠けているものと、すべてのスペイン語の文字は奇妙に見えます。 PS。これらの奇妙な文字のオリジナルバージョンをphpに書き込んだとき、それらはすべて正確に見えます。

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

シンプル:curlを使用する場合、文字列をutf-8にエンコードします。デコードするだけです。

Description

string utf8_decode ( string $data )

この関数は、UTF-8エンコードされていると想定されるデータをISO-8859-1にデコードします。

32
julio

ヘッダーを使用できます

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

デコード文字列の後

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

それは私のために働いた

12
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
$output = curl_exec($ch);
$result = iconv("Windows-1251", "UTF-8", $output);
3
Taron

最初の方法(内部関数)

私が以前試した最良の方法は、 urlencode() を使用することです。 URL全体に使用しないでください。代わりに、必要な部品にのみ使用してください。たとえば、2つの「text-fa」フィールドと「text-en」フィールドがあり、それぞれペルシャ語と英語のテキストが含まれているリクエストでは、英語のテキストではなくペルシャ語のテキストのみをエンコードする必要があります。

2番目の方法(cURL関数を使用)

ただし、エンコードする必要がある文字の範囲がより制限されている場合は、より良い方法があります。これらの方法の1つは、 curl_setopt() に渡すことにより、CURLOPT_ENCODINGを使用することです。

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

CURLを介してwindows-1252でエンコードされたファイルを取得し、mb_detect_encoding(curl_exec($ch));がUTF-8を返しました。 utf8_encode(curl_exec($ch));を試しましたが、文字は正しいものでした。

0
michalzuber