要采集一個網站,目標站采用了gzip壓縮傳輸網頁,本來應該只要發送一個http頭 Accept-Encoding: identity或者干脆不發送這個頭等,就可以使目標站返回沒有經過gzip壓縮的頁面了,不過很不幸,目標站無視客戶端的請求,仍然返回gzip數據,造成亂碼。 其實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; } } 調用方法很簡單: 復制代碼 代碼如下: $f=@file_get_contents("http://www.jb51.net"); echo gzdecode($f);