30

我有一个 php 脚本,它调用另一个网页并写入页面的所有 html,一切正常,但是存在字符集问题。我的 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);
4

6 回答 6

38

简单:当您使用 curl 时,它会将字符串编码为utf-8您只需要解码它们..

Description

string utf8_decode ( string $data )

此函数将假定已UTF-8编码的数据解码为ISO-8859-1

于 2012-11-22T15:44:25.793 回答
16

您可以使用此标题

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

并在解码字符串后

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

它对我有用

于 2014-09-04T06:48:45.247 回答
4
$output = curl_exec($ch);
$result = iconv("Windows-1251", "UTF-8", $output);
于 2017-07-30T12:41:50.690 回答
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;
}
于 2013-11-21T11:56:06.970 回答
3

我正在通过 cURL 和mb_detect_encoding(curl_exec($ch));返回的 UTF-8 获取 windows-1252 编码文件。试过utf8_encode(curl_exec($ch));了,字符是正确的。

于 2016-05-20T16:26:07.073 回答
2

第一种方法(内部函数)

我之前尝试过的最好方法是使用urlencode(). 请记住,不要将它用于整个 url;相反,仅将其用于所需的部分。例如,一个请求有两个“text-fa”和“text-en”字段,它们分别包含一个波斯语和一个英语文本,您可能只需要对波斯语文本进行编码,而不是对英语文本进行编码。

第二种方法(使用 cURL 函数)

但是,如果必须编码的字符范围更有限,还有更好的方法。其中一种方法是使用CURLOPT_ENCODING, 将其传递给curl_setopt()

curl_setopt($ch, CURLOPT_ENCODING, "");
于 2017-06-30T21:24:23.030 回答