来自 新葡8455编程 2020-01-01 20:43 的文章
当前位置: 新葡棋牌京官网app > 新葡8455编程 > 正文

php file_get_contents抓取Gzip网页乱码的三种解决方法_php实例_脚本之家

      其实php对gzip解压很简单,用内置的gzdecode函数就可以了,不过很可惜我配置了半天也无法支持gzdecode函数,所以只好变通一下: 
复制代码 代码如下:
if (!function_exists('gzdecode')) {     
    function gzdecode ($data) {     
        $flags = ord(substr($data, 3, 1));     
        $headerlen = 10;     
        $extralen = 0;     
        $filenamelen = 0;     
        if ($flags & 4) {     
            $extralen = unpack('v' ,substr($data, 10, 2));     
            $extralen = $extralen[1];     
            $headerlen += 2 + $extralen;     
        }     
        if ($flags & 8) // Filename     
            $headerlen = strpos($data, chr(0), $headerlen) + 1;     
        if ($flags & 16) // Comment     
            $headerlen = strpos($data, chr(0), $headerlen) + 1;     
        if ($flags & 2) // CRC at end of file     
            $headerlen += 2;     
        $unpacked = @gzinflate(substr($data, $headerlen));     
        if ($unpacked === FALSE)     
              $unpacked = $data;     
        return $unpacked;     
     }     
}

把抓取到的内容转下编码即可($content=iconv("GBK", "UTF-8//IGNORE", $content);),我们这里讨论的是如何抓取开了Gzip的页面。怎么判断呢?获取的头部当中有Content-Encoding: gzip说明内容是GZIP压缩的。用FireBug看一下就知道页面开了gzip没有。下面是用firebug查看我的博客的头信息,Gzip是开了的。复制代码 代码如下:请求头信息原始头信息Accepttext/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Encodinggzip, deflateAccept-Languagezh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3Connectionkeep-aliveCookie__utma=225240837.787252530.1317310581.1335406161.1335411401.1537; __utmz=225240837.1326850415.887.3.utmcsr=google|utmccn=|utmcmd=organic|utmctr=%E4%BB%BB%E4%BD%95%E9%A1%B9%E7%9B%AE%E9%83%BD%E4%B8%8D%E4%BC%9A%E9%82%A3%E4%B9%88%E7%AE%80%E5%8D%95%20site%3Awww.nowamagic.net; PHPSESSID=888mj4425p8s0m7s0frre3ovc7; __utmc=225240837; __utmb=225240837.1.10.1335411401Hostwww.nowamagic.netUser-AgentMozilla/5.0 (Windows NT 5.1; rv:12.0) Gecko/20100101 Firefox/12.0下面介绍一些解决方案:

调用方法很简单: 
复制代码 代码如下:
$f=@file_get_contents("");      
echo gzdecode($f);     

1. 使用自带的zlib库如果服务器已经装了zlib库,用下面的代码可以轻易解决乱码问题。复制代码 代码如下:$data = file_get_contents("compress.zlib://".$url);

2. 使用CURL代替file_get_contents复制代码 代码如下:function curl_get{$curl = curl_init;curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10);if curl_setopt($curl, CURLOPT_ENCODING, "gzip"); // 关键在这里$content = curl_exec;curl_close;return $content;}

3. 使用gzip解压函数复制代码 代码如下:function gzdecode { $len = strlen; if ($len < 18 || strcmp,"x1fx8b")) { return null; // Not GZIP format } $method = ord; // Compression method $flags = ord; // Flags if ($flags & 31 != $flags) { // Reserved bits are set -- NOT ALLOWED by RFC 1952 return null; } // NOTE: $mtime may be negative (PHP integer limitations) $mtime = unpack("V", substr; $mtime = $mtime[1]; $xfl = substr; $os = substr; $headerlen = 10; $extralen = 0; $extra = ""; if { // 2-byte length prefixed EXTRA data in header if ($len - $headerlen - 2 < 8) { return false; // Invalid format } $extralen = unpack); $extralen = $extralen[1]; if ($len - $headerlen - 2 - $extralen < 8) { return false; // Invalid format } $extra = substr; $headerlen += 2 + $extralen; }

$filenamelen = 0; $filename = ""; if { // C-style string file NAME data in header if ($len - $headerlen - 1 < 8) { return false; // Invalid format } $filenamelen = strpos(substr,chr; if ($filenamelen === false || $len - $headerlen - $filenamelen - 1 < 8) { return false; // Invalid format } $filename = substr($data,$headerlen,$filenamelen); $headerlen += $filenamelen + 1; }

本文由新葡棋牌京官网app发布于新葡8455编程,转载请注明出处:php file_get_contents抓取Gzip网页乱码的三种解决方法_php实例_脚本之家

关键词: