解决PHP中file_get_contents抓取网页中文乱码问题

 更新时间:2016年11月25日 17:37  点击:1775
file_get_contents函数本来就是一个非常优秀的php自带本地与远程文件操作函数,它可以让我们不花吹挥之力把远程数据直接下载,但我在使用它读取网页时会碰到有些页面是乱码了,下面我就来给各位总结具体的解决办法。

根据网上有朋友介绍说原因可能是服务器开了GZIP压缩。

下面是用firebug查看我的博客的头信息,Gzip是开了的。

请求头信息原始头信息

 代码如下 复制代码

Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
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.111cn.net
User-Agent Mozilla/5.0 (Windows NT 5.1; rv:12.0) Gecko/20100101 Firefox/12.0


可以从header信息中找到 Content-Encoding 项是 Gzip 。

解决办法比较简单。

就是用 curl 代替 file_get_contents 去获取,然后在 curl 配置参数中加一条

 代码如下 复制代码

curl_setopt($ch, CURLOPT_ENCODING, "gzip");

今天用 file_get_contents 抓图片的时候,开始没发现这个问题,废了老大劲才找出来

1. 使用自带的zlib库

如果服务器已经装了zlib库,用下面的代码可以轻易解决乱码问题。

 代码如下 复制代码

$data = file_get_contents("compress.zlib://".$url);

当然也可以使用curl模块来解决人我的问题这里我给各位推荐一文章,如下你感兴趣的文章

php+mysql数据时我们必须保证提交到数据库的编码与mysql编码是一致的这样才可以保存中文不出现问号乱码问题,下面我先整理两个让mysql与页面保证编码一致的方法。

解决中文插入数据库乱码的方法:

直接把中文转变成utf-8格式,大多是这个问题导致的。

 代码如下 复制代码

$str = iconv('gbk','utf-8',$str);

如果还不行检查网页编码是否正确:

 代码如下 复制代码

<?php
    header("Content-Type:text/html;charset=utf-8");
?>

例子

举例(由于我懒得写,网上的这个例子感觉还挺清楚的):
建表:

 代码如下 复制代码

Create TABLE `net_city` (
`cityid` smallint(4) NOT NULL auto_increment,
`cityname` varchar(80) NOT NULL default '',
`provinceid` smallint(2) NOT NULL default '0',
`inarea` varchar(5000) NOT NULL default '',
`outarea` varchar(5000) NOT NULL default '',
`tel` varchar(400) NOT NULL default '',
PRIMARY KEY (`cityid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
PHP里的代码:
$conn=mysql_connect("localhost", "用户名", "密码");
mysql_query("set names 'utf8'",$conn);
mysql_select_db(" www.111cn.net 数据名",$conn);
$exec="insert into net_city (cityname,inarea,outarea,tel) values ('".$link_cityname."','".$link_inarea."','".$link_outarea."','".$link_tel."')";

$result=mysql_query($exec,$conn);
if($result){
       echo "1";
     }else{
        echo "0";
     }
mysql_close($conn);

后来我试了试全部都用成gbk的,也是可以的~

在查询数据时我们直接使用mysql_query()来设置

mysql_query("SET NAMES GBK");  //GBK处为编码设置

例子

下面是 "insert.php" 页面的代码:

 代码如下 复制代码

<?php$con = mysql_connect("localhost","peter","abc123");

if (!$con) { die('Could not connect: ' . mysql_error()); }

mysql_select_db("my_db", $con);

mysql_query("SET NAMES GBK");  //GBK处为编码设置

$sql="INSERT INTO person (FirstName, LastName, Age)VALUES('$_POST[firstname]','$_POST[lastname]','$_POST[age]')";

if (!mysql_query($sql,$con))

{ die('Error: ' . mysql_error()); }

echo "1 record added";

mysql_close($con)

?>

SESSION丢失意思是讲在当前页面的session是有值了,但到了另一个页面session就没有值了,这有违背了session的正常逻辑了,正常情况session是服务器全局变量是可以在当前域的任何页面使用的,那现在这种问题是什么问题呢,下面我来给大家讲一下。

问题分析研究

1、客户端禁用了cookie

2、浏览器出现问题,暂时无法存取cookie

3、php.ini中的session.use_trans_sid = 0或者编译时没有打开--enable-trans-sid选项

实例分析

session_start()声明后在另外一个页面无法获得刚才申明的session值。

打开phpinfo()查看了一下SESSION条发现这两条估计是和我的情况符合要求。

找到/etc/php.ini文件把 www.111cn.net

session.use_trans_sid = 0 修改成了1

重启服务 service httpd restart还是不行,于是仔细看了

session.save_path 它有两个项 Local Value和Master Value

Local Value    /var/lib/php/session

Master Value   /tmp

我把这两个目录都设置权限chmod a+rwx /var/lib/php/session

chmod a+rwx /tmp

搞定,能传递了。

另外说一下,如果服务器不是自己的,那肯定无法修改权限了。

不过我的是自己的PC机,作为一个调试环境,还是希望大众一些,所以就没有考虑用session_id()来解决这个问题了

总结

1、设置php.ini中的session.use_trans_sid = 1或者编译时打开打开了–enable-trans-sid选项,
让PHP自动跨页传递session id。
2、手动通过URL传值、隐藏表单传递session id。
3、用文件、数据库等形式保存session_id,在跨页过程中手动调用。

我们知道在mysql查询数据库时如果我们中在查询前设置mysql_query是会出现乱码的,但是很多朋友这样设置mysql_query(“set names utf-8″)但还是乱码这是什么原因呢,下面我们来看看具体设置方法。

是在mysql中用utf8表示utf-8而已,就是指代一种编码。
在php中mysql_query(“set names utf-8″);因为mysql中定义的是utf8而不是utf-8,所以这条语句是执行不成功的,效果和mysql_query(“set names test”)一样,所以你存储和获得的mysql编码并没有改变。改为

 

 代码如下 复制代码
mysql_query(“set names utf8″);就行了。


各们注意了前面是uft-8而后面是uft8这是有区别的哦,但这个对于gbk或gbk2312和网页设置又可以一样,这里估计是mysql有原因吧。

json_decode对于英文估计返回都是正常的但有些朋友碰到中文时会就发现返回为null或空了,下面我来给各位朋友简单介绍此问题解决方法。

今天在做一个东西的时候需要抓取淘宝的一些数据,找到了请求的url,返回了一个callback,看了下callback中的参数是一个对象,通过正则匹配去到了数组,但是在使用json_decode()转换的时候返回的是NULL,老郁闷了,前一段时间要做一个东西也是因为这个原因,没有成功的把json对象转换成php的数组,放弃了,今天又遇到了,终于找到了解决的办法。

原因在于:抓取的数数据是是GBK格式,通过抓包看到,返回的header头中

 代码如下 复制代码

 Content-Type:text/html;charset=GBK

这个时候用icvo转码下,然后在json_decode()就可以正常转换了

 代码如下 复制代码

iconv('gbk','utf-8',$data[1][0]);


这里还需要主要的是你php代码文件的格式,建议是utf-8无bom头。


昨天发现博客的收录全部掉了,网站关了一个多月,唉。度娘你就块收了我把。

[!--infotagslink--]

相关文章