本节内容:
file_get_contents抓取Gzip网页乱码
在php编程中,使用 file_get_contents() 函数抓取网页会发生乱码。
导致乱码的可能原因如下:
一个是编码问题,一个是目标页面开了Gzip。
以下为大家介绍下在开启Gzip功能时,防止产生乱码的方法。
把抓取到的内容转下编码即可($content=iconv("GBK", "UTF-8//IGNORE", $content);),
讨论下如何抓取开了Gzip的页面。
获取的头部当中有Content-Encoding: gzip说明内容是GZIP压缩的。
用FireBug看一下即可看出页面是否开启gzip压缩。
用firebug查看我的博客的头信息,Gzip是开了的。
请求头信息原始头信息
Accept-Encoding gzip, deflate
Accept-Language zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Connection keep-alive
Cookie __utma=225240837.787252530.1317310581.1335406161.1335411401.1537; __utmz=225240837.1326850415.887.3.utmcsr=google|utmccn=(organic)|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.1335411401
Host www.
User-Agent Mozilla/5.0 (Windows NT 5.1; rv:12.0) Gecko/20100101 Firefox/12.0
下面提供一些解决方法,供大家参考。
1,使用自带的zlib库
如果服务器已经装了zlib库,可用以下方法解决乱码问题。
$data = file_get_contents("compress.zlib://".$url);
2,使用CURL代替file_get_contents
function curl_get($url, $gzip=false){
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10);
if($gzip) curl_setopt($curl, CURLOPT_ENCODING, "gzip"); // 关键在这里
$content = curl_exec($curl);
curl_close($curl);
return $content;
}
3,使用gzip解压函数
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;
}
调用示例:
$html=gzdecode($html);
希望以上介绍的三个方法,可以帮助大家解决大部分gzip引起的抓取乱码的问题。
,祝大家学习进步。
本节内容:
php 导出word的函数。
例子:
<?php
/**
* 导出word文件
* by www.
*/
function docsave($path,$data){
$data = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns="http://www.w3.org/TR/REC-html40">'.$data.'</html>';
$fp=fopen($path,"wb");
fwrite($fp,$data);
fclose($fp);
die('success');
}
$data='<p></p>
<p></p>
<p></p>';
$data = mb_convert_encoding($data, "gb2312", "UTF-8"); //将UTF8字符集 转化为 GB2312的
docsave("./data.doc",$data);
//header("Content-Type: application/msword");
?>
您可能感兴趣的文章:
php导出word格式数据的实现代码
php 导出word文档的简单示例
php导出Word后页面视图和样式问题的解决方法
php导出word格式文档的实例代码
php生成excel或word文档的最简单方法
php生成word文档(读取数据库)
php生成word最简单的例子
php使用phpword生成word文档的例子
php生成word文件的简单范例
php 生成 导出word(可包含图片)的代码
php生成word的例子
将网页导出为Word文档的php代码介绍
php使用phpword生成word文档
本节内容:
一个php 导出word文档的类
例子:
/**
* 生成word文档的类
* by www.
*/
class word
{
function start()
{
ob_start();
echo '<html xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:w="urn:schemas-microsoft-com:office:word"
xmlns="http://www.w3.org/TR/REC-html40">';
}
function save($path)
{
echo "</html>";
$data = ob_get_contents();
ob_end_clean();
$this->wirtefile ($path,$data);
}
function wirtefile ($fn,$data)
{
$fp=fopen($fn,"wb");
fwrite($fp,$data);
fclose($fp);
}
}
//导出的程序文件
//导出 ---start---
require SITE_ROOT.'include/word.class.php'; //类文件放在根目录下的include文件夹下
$word = new word();
//查询数据填入word 中
$result = $db->query("SELECT * FROM ".DB_PRE."box where status='9' order by boxid DESC");
while($r = $db->fetch_array($result))
{
$r['orderinfo'] = $db->get_one("SELECT * FROM ".DB_PRE."order where orderid='".$r['orderid']."'");
$r['wrapinfo'] = $db->get_one("SELECT * FROM ".DB_PRE."wrap where orderid='".$r['orderid']."'");
$boxlist[] = $r;
}
foreach($boxlist as $key=>$val){
$order->UPCAbarcode($val['box_code']);
$html .='<table width=800 cellpadding="6" align="center" cellspacing="5" bgcolor="#000000">
<tr bgcolor="White" height="50">
<td width=80 >iGo运<br/>单号</td>
<td width=300 ><img src='/blog_article/.$val['iGocode_code'].' /><br/> '.$val['box_code'].'</td>
<td width=60 >日期</td>
<td width=100 >'.date('Y-m-d',$val[create_date]).'</td>
<td width=100 >标示<br/>姓名</td>
<td width=240 >'.$val[code].'/'.$val['orderid'].'<br/>'.$val['orderinfo']['user_name'].'</td>
</tr>
<tr bgcolor="White">
<td width=60 >件数</td>
<td width=40 >3</td>
<td width=40 >重量</td>
<td width=150 >56.5</td>
<td width=40 >品名</td>
<td width=390 >咬咬了,吸盘碗,学饮杯,鱼干油</td>
</tr>
<tr bgcolor="White">
<td width=110 >服务<br/>类别</td>
<td width=200 >库房服务</td>
<td width=110 >服务<br/>要求</td>
<td width=280 >合小箱</td>
</tr>
<tr bgcolor="White">
<td width=120 ><br/><br/>客户<br/>备注<br/><br/></td>
<td width=580 >'.$val['orderinfo']['beizhu'].'</td>
</tr>
<tr bgcolor="White">
<td width=120 ><br/><br/><br/>到货<br/>情况<br/><br/><br/><br/></td>
<td width=580 >什么问题?果点不到<br/>什么问题?果点不到<br/>什么问题?果点不到<br/><br/><br/><br/><br/><br/><br/><br/></td>
</tr>
</table> <br/><br/><br/><br/>
';
}
$word->start();
$filename = '拣货单导出.doc';
echo $html;
$word->save($filename);
//文件的类型
header('Content-type: application/word');
header('Content-Disposition: attachment; filename="拣货单导出.doc"');
readfile($filename);
ob_flush();
flush();
exit();
//导出word --end--
您可能感兴趣的文章:
php导出word文件的简单例子
php 导出word文档的简单示例
php导出Word后页面视图和样式问题的解决方法
php导出word格式文档的实例代码
php生成excel或word文档的最简单方法
php生成word文档(读取数据库)
php生成word最简单的例子
php使用phpword生成word文档的例子
php生成word文件的简单范例
php 生成 导出word(可包含图片)的代码
php生成word的例子
将网页导出为Word文档的php代码介绍
php使用phpword生成word文档