ホームページ >バックエンド開発 >PHPチュートリアル >php file_get_contents が文字化けした Gzip Web ページを取得するための 3 つの解決策_PHP チュートリアル
キャプチャしたコンテンツをエンコーディングに変換するだけです ($content=iconv("GBK", "UTF-8//IGNORE", $content);)。ここで説明しているのは、Gzip を有効にしてページをキャプチャする方法です。どのように判断するか?取得したヘッダーには、コンテンツが GZIP 圧縮されていることを示す Content-Encoding: gzip が含まれています。 FireBug を使用して、ページで gzip が有効になっているかどうかを確認します。以下はGzipをONにして閲覧したブログのヘッダー情報です。
1. 組み込みの zlib ライブラリを使用する
サーバーに zlib ライブラリがインストールされている場合は、次のコードを使用してコードの文字化けの問題を簡単に解決できます。
2. file_get_contents の代わりに CURL を使用します
コードをコピーします
$filenamelen = 0;
$filename = "";
if ($flags & 8) {
// C-style string file NAME data in header
if ($len - $headerlen - 1 < 8) {
return false; // Invalid format
}
$filenamelen = strpos(substr($data,8+$extralen),chr(0));
if ($filenamelen === false || $len - $headerlen - $filenamelen - 1 < 8) {
return false; // Invalid format
}
$filename = substr($data,$headerlen,$filenamelen);
$headerlen += $filenamelen + 1;
}
$commentlen = 0;
$comment = "";
if ($flags & 16) {
// C-style string COMMENT data in header
if ($len - $headerlen - 1 < 8) {
return false; // Invalid format
}
$commentlen = strpos(substr($data,8+$extralen+$filenamelen),chr(0));
if ($commentlen === false || $len - $headerlen - $commentlen - 1 < 8) {
return false; // Invalid header format
}
$comment = substr($data,$headerlen,$commentlen);
$headerlen += $commentlen + 1;
}
$headercrc = "";
if ($flags & 1) {
// 2-bytes (lowest order) of CRC32 on header present
if ($len - $headerlen - 2 < 8) {
return false; // Invalid format
}
$calccrc = crc32(substr($data,0,$headerlen)) & 0xffff;
$headercrc = unpack("v", substr($data,$headerlen,2));
$headercrc = $headercrc[1];
if ($headercrc != $calccrc) {
return false; // Bad header CRC
}
$headerlen += 2;
}
// GZIP FOOTER - These be negative due to PHP's limitations
$datacrc = unpack("V",substr($data,-8,4));
$datacrc = $datacrc[1];
$isize = unpack("V",substr($data,-4));
$isize = $isize[1];
// 解凍を実行します:
$bodylen = $len-$headerlen-8;
if ($bodylen // これは決して起こるべきではありません - 実装のバグです。
null を返します。
}
$body = substr($data,$headerlen,$bodylen);
$data = "";
if ($bodylen > 0) {
switch ($method) {
case 8:
// 現在サポートされている唯一の圧縮方式:
$data = gzinflate($body);
休憩。
デフォルト:
// 不明な圧縮方法
return false;
}
} else {
// ゼロバイトの本文コンテンツが許可されるかどうかはわかりません。
// とりあえず許可します... 何もしません...
}
// 解凍後のサイズと CRC32 を確認します:
// 注: $isize
// 大きいサイズでは負の値になる可能性があるため、
// PHP の整数制限が strlen() にどのように影響するかによっては、データ サイズが大きい場合に失敗する可能性があります。
if ($isize != strlen($data) || crc32($data) != $datacrc) {
// 形式が正しくありません。 長さまたは CRC が一致しません。
false を返します。
}
$data を返します。
}