使用file_get_contents()获取sohu博客乱码问题
2010-11-01 17:15
691 查看
问题:
最后打印出来的结果都是乱码
,经测试,新浪博客不会出现此问题,只有搜狐博客有次问题
原因:
获取的头部当中有Content-Encoding: gzip说明内容是GZIP压缩的 解压后就能得到内容了
PHP内置的file_get_contents不支持GZIP 可以试试CURL 好象能处理GZIP
array(11) {
[0]=>
string(15) "HTTP/1.1 200 OK"
[1]=>
string(35) "Content-Type: text/html;charset=gbk"
[2]=>
string(17) "Connection: close"
[3]=>
string(13) "Server: nginx"
[4]=>
string(35) "Date: Fri, 29 Oct 2010 00:36:51 GMT"
[5]=>
string(26) "Vary: Host,Accept-Encoding"
[6]=>
string(14) "Pragma: Public"
[7]=>
string(26) "Cache-Control: max-age=300"
[8]=>
string(38) "Expires: Fri, 29 Oct 2010 00:41:53 GMT"
[9]=>
string(22) "Content-Encoding: gzip
"
[10]=>
string(14) "FSS-Cache: HIT"
}
解决办法:
1.定义一位外国高人写的gzip解码函数gzdecode():
2.调用此函数将获得的数据解码
iehttpheaders,httpwatch,FF的LiveHTTPHeaders,,FF的firebug,FF的httpfox都可以看头部信息的,还有其它很多工具。
$html=file_get_contents('http://xuxiaonian.blog.sohu.com/160201697.html'); var_dump($html);
最后打印出来的结果都是乱码
,经测试,新浪博客不会出现此问题,只有搜狐博客有次问题
原因:
获取的头部当中有Content-Encoding: gzip说明内容是GZIP压缩的 解压后就能得到内容了
PHP内置的file_get_contents不支持GZIP 可以试试CURL 好象能处理GZIP
array(11) {
[0]=>
string(15) "HTTP/1.1 200 OK"
[1]=>
string(35) "Content-Type: text/html;charset=gbk"
[2]=>
string(17) "Connection: close"
[3]=>
string(13) "Server: nginx"
[4]=>
string(35) "Date: Fri, 29 Oct 2010 00:36:51 GMT"
[5]=>
string(26) "Vary: Host,Accept-Encoding"
[6]=>
string(14) "Pragma: Public"
[7]=>
string(26) "Cache-Control: max-age=300"
[8]=>
string(38) "Expires: Fri, 29 Oct 2010 00:41:53 GMT"
[9]=>
string(22) "Content-Encoding: gzip
"
[10]=>
string(14) "FSS-Cache: HIT"
}
解决办法:
1.定义一位外国高人写的gzip解码函数gzdecode():
function gzdecode($data) { $len = strlen($data); if ($len < 18 || strcmp(substr($data,0,2),"/x1f/x8b")) { return null; // Not GZIP format (See RFC 1952) } $method = ord(substr($data,2,1)); // Compression method $flags = ord(substr($data,3,1)); // 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($data,4,4)); $mtime = $mtime[1]; $xfl = substr($data,8,1); $os = substr($data,8,1); $headerlen = 10; $extralen = 0; $extra = ""; if ($flags & 4) { // 2-byte length prefixed EXTRA data in header if ($len - $headerlen - 2 < 8) { return false; // Invalid format } $extralen = unpack("v",substr($data,8,2)); $extralen = $extralen[1]; if ($len - $headerlen - 2 - $extralen < 8) { return false; // Invalid format } $extra = substr($data,10,$extralen); $headerlen += 2 + $extralen; } $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]; // Perform the decompression: $bodylen = $len-$headerlen-8; if ($bodylen < 1) { // This should never happen - IMPLEMENTATION BUG! return null; } $body = substr($data,$headerlen,$bodylen); $data = ""; if ($bodylen > 0) { switch ($method) { case 8: // Currently the only supported compression method: $data = gzinflate($body); break; default: // Unknown compression method return false; } } else { // I'm not sure if zero-byte body content is allowed. // Allow it for now... Do nothing... } // Verifiy decompressed size and CRC32: // NOTE: This may fail with large data sizes depending on how // PHP's integer limitations affect strlen() since $isize // may be negative for large sizes. if ($isize != strlen($data) || crc32($data) != $datacrc) { // Bad format! Length or CRC doesn't match! return false; } return $data; }
2.调用此函数将获得的数据解码
$html=file_get_contents('http://xuxiaonian.blog.sohu.com/160201697.html'); $html=gzdecode($html);
iehttpheaders,httpwatch,FF的LiveHTTPHeaders,,FF的firebug,FF的httpfox都可以看头部信息的,还有其它很多工具。
相关文章推荐
- PHP的file_get_contents获取远程页面乱码的问题
- 解析PHP中的file_get_contents获取远程页面乱码的问题【转】
- PHP中使用file_get_contents()抓取网页乱码的问题
- 解析PHP中的file_get_contents获取远程页面乱码的问题
- PHP中使用file_get_contents抓取网页中文乱码问题解决方法
- 解析PHP中的file_get_contents获取远程页面乱码的问题
- PHP中使用file_get_contents抓取网页中文乱码问题解决方法
- 循环file_get_contents()部分内容不能获取的问题
- 关于file_get_contents读取http乱码问题
- 使用curl、socket、file_get_contents提交数据和获取数据
- file_get_contents 输出乱码问题
- php 使用file_get_contents的问题
- 为什么使用file_get_contents获取不到百度竞价内容
- PHP CURL或file_get_contents获取网页标题的代码及两者效率的稳定性问题
- file_get_contents获取json内容处理失败的问题
- 当file_get_contents获取不到网页内容时,以下方法可使用
- 执行、获取远程代码返回:file_get_contents 超时处理的问题详解
- 使用curl、socket、file_get_contents提交数据和获取数据
- 解决PHP中file_get_contents抓取网页中文乱码问题
- file_put_contents以及file_get_contents的用法与在使用过程中遇到的问题(PHP学习)