解决PHP中file_get_contents抓取网页中文乱码问题
根据网上有朋友介绍说原因可能是服务器开了GZIP压缩。
下面是用firebug查看我的博客的头信息,Gzip是开了的。
请求头信息原始头信息
代码如下 | 复制代码 |
Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 |
可以从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 |
例子
举例(由于我懒得写,网上的这个例子感觉还挺清楚的):
建表:
代码如下 | 复制代码 |
Create TABLE `net_city` ( $result=mysql_query($exec,$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) ?> |
问题分析研究
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中用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有原因吧。
今天在做一个东西的时候需要抓取淘宝的一些数据,找到了请求的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头。
昨天发现博客的收录全部掉了,网站关了一个多月,唉。度娘你就块收了我把。
相关文章
- 最近做了个扫描二维码得到vcard的项目,遇到一个问题,有一部分生成完的二维码,用android系统手机扫描后得到的vcard中的中文姓名是乱码,经过比对发现,这部分vcard中ORG这个...2016-11-25
php 中file_get_contents超时问题的解决方法
file_get_contents超时我知道最多的原因就是你机器访问远程机器过慢,导致php脚本超时了,但也有其它很多原因,下面我来总结file_get_contents超时问题的解决方法总结。...2016-11-25php file_get_contents 设置代理抓取页面示例
file_get_contents函数在php中可以直接打开本地文件也可以直接抓取远程服务器文件,如果简单的采集我们可以使用file_get_contents直接来操作,如果有防采集我们可能需要...2016-11-25- 今天在写一个vbs的时候,发现中文乱码,后来写好代码正常运行的代码压缩一下给了同事,发现报无效字符,经过验证后发现原来是编码的问题导致,这里就为大家分享一下...2020-06-30
php报错file_get_contents(): php_network_getaddresses问题
本文章来为各位介绍一篇关于file_get_contents(): php_network_getaddresses: getaddrinfo failed: Name or service not known...错误解决办法。 昨天,服务器的DN...2016-11-25关于Mysql中文乱码问题该如何解决(乱码问题完美解决方案)
最近两天做项目总是被乱码问题困扰着,这不刚把mysql中文乱码问题解决了,下面小编把我的解决方案分享给大家,供大家参考,也方便以后自己查阅。首先:用show variables like “%colla%”;show varables like “%char%”;这两条...2015-11-24- file_get_contents的超时处理话说,从PHP5开始,file_get_content已经支持context了(手册上写着:5.0.0 Added the context support. ),也就是说,从5.0开始,file_get_contents其实也可以POST数据。今天说的这篇是讲超时的,确实在...2013-10-04
- 在 php 中使用 json_encode() 内置函数(php > 5.2)可以使用得 php 中数据可以与其它语言很好的传递并且使用它。这个函数的功能是将数值转换成json数据存储格式。<?php$arr = array ( 'Name'=>'希亚', 'Age'...2015-11-08
file_get_contents()获取https出现这个错误Unable to find the wrapper “https”
下面我们来看一篇关于file_get_contents()获取https出现这个错误Unable to find the wrapper “https”问题的解决办法. file_get_contents()获取https出现这个错...2016-11-25解决HttpPost+json请求---服务器中文乱码及其他问题
这篇文章主要介绍了解决HttpPost+json请求---服务器中文乱码及其他问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-22- 用到iconv函数把抓取来过的utf-8编码的页面转成gb2312, 发现只有用iconv函数把抓取过来的数据一转码数据就会无缘无故的少一些 代码如下 复制代码 ...2016-11-25
- 本文章来给大家介绍php mail发邮件标题中文乱码的问题解决办法,希望到此类问题的朋友可进入参考。 当使用下面的PHP语句发送电子邮件的时候,如果编码和接收邮箱编码...2016-11-25
php提示Warning: file_get_contents(): couldn’t resolve
在使用file_get_contents函数获取远程文件时提示Warning: file_get_contents(): couldn’t resolve错误了,这个我们可以看出是dns的问题,解决办法也简单。 今天在...2016-11-25- PHPWord是一个可以把相关文件生成word文档的插件了,但由于是老外开发的对于gbk支持不好,所以我们在导出带有中文的word时会出现乱码问题,下面本文就PHPWord中文乱码问题...2016-11-25
- 本文主要一步一步介绍利用C#抓取页面数据的过程,抓取HTML,获取标题、描述、图片等信息,并去除HTML,希望对大家有所帮助。...2020-06-25
- 如果ASCii码大于0xa0就是半个汉字;了解substr()、mb_substr()、ord()。 现在常用的编码格式是UTF8,GBK,GBK2312,BIG5。GBK是GBK2312的升级。现在我开发中遇到的基本都...2016-11-25
- 本文章来给各位同学介绍file_get_contents不能获取带端口的网址解决办法,有需要了解的同学可参考。 先们来了解file_get_contents() 函数,官方介绍说它是把整个...2016-11-25
- 这篇文章主要介绍了iis伪静态中文url出现乱码的解决办法,需要的朋友可以参考下...2017-07-06
php中file_get_contents和curl_get_contents介绍
php中file_get_contents和curl_get_contents介绍 有需要的朋友可参考一下。 分享一个实际在用的函数: file_get_contents() 函数是用于将文件的内容读入到一个字符...2016-11-25- 这篇文章主要介绍了.Net获取URL中文参数值的乱码问题解决方法,总结分析了针对URL参数传递中出现的乱码问题与相应的解决方法,具有一定参考借鉴价值,需要的朋友可以参考下...2021-09-22