首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP file_get_contents 抓取網頁中文亂碼:GZIP 壓縮與編碼雙重解法

     編輯:PHP 綜合知識

問題現象

使用 file_get_contents($url) 取遠端頁面,中文顯示亂碼。Firebug 觀察回應 Header 發現:Content-Encoding: gzip,伺服器開啟 GZIP 壓縮,file_get_contents 不會自動解壓,直接回傳二進位壓縮資料導致亂碼。

方案一:改用 cURL 自動解壓(推薦)

function curl_get($url) {
    $ch = curl_init();
    curl_setopt_array($ch, [
        CURLOPT_URL            => $url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING       => 'gzip',      // 關鍵:自動接受並解壓 gzip/deflate
        CURLOPT_USERAGENT      => 'Mozilla/5.0 (compatible; PHP Bot)',
        CURLOPT_TIMEOUT        => 10,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_SSL_VERIFYPEER => false,       // 僅測試用,生產請驗證憑證
    ]);
    $data = curl_exec($ch);
    curl_close($ch);
    return $data;
}

$html = curl_get('https://example.com/page.html');

方案二:利用 zlib:// 串流包裝器(無需 cURL)

前提:PHP 編譯時啟用 --with-zlib(預設開啟)。

$html = file_get_contents('compress.zlib://' . $url);

原理:PHP 內建 compress.zlib:// 串流過濾器,讀取時自動解壓。

編碼轉換:確保最終為 UTF-8

抓取後若仍亂碼,可能是來源頁面非 UTF-8(如 Big5、GB2312)。統一轉碼:

$encoding = mb_detect_encoding($html, ['UTF-8', 'GB2312', 'BIG5', 'CP950'], true);
if ($encoding && $encoding !== 'UTF-8') {
    $html = mb_convert_encoding($html, 'UTF-8', $encoding);
}

完整健壯抓取函式

function fetch_page($url) {
    $html = @file_get_contents('compress.zlib://' . $url);
    if ($html === false || strlen($html) < 100) { // 失敗或內容過短,嘗試 cURL
        $html = curl_get($url);
    }
    // 編碼修正
    $enc = mb_detect_encoding($html, ['UTF-8','GB2312','BIG5','CP950'], true);
    if ($enc && $enc !== 'UTF-8') $html = mb_convert_encoding($html, 'UTF-8', $enc);
    // 移除 BOM
    if (substr($html, 0, 3) === "\xEF\xBB\xBF") $html = substr($html, 3);
    return $html;
}

效能對比

方法支援 GZIP支援 HTTPS依賴擴展速度
file_get_contents否(需 zlib://)是無快
file_get_contents + zlib://是是zlib快
cURL是(CURLOPT_ENCODING)是curl中等

建議:優先 compress.zlib:// 簡潔高效,失敗 fallback cURL,並統一編碼轉 UTF-8。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved