网页中的编码问题,编码转换问题,以及file_get_contents
来源:互联网 发布:mac文件夹无故消失 编辑:程序博客网 时间:2024/03/29 16:30
最近遇到了很多关于编码的问题。总结一下,记录在此。
1.
$PageCode=curl_file_get_contents("http://www.12306.cn"); echo $PageCode;
我的页面编码全是utf-8,看到铁道部的源文件编码方式也是utf-8(实际上是www.12306.cn/mormhweb/index.html的编码方式是utf-8,因为铁道部的首页跳转到了此页。),所以不用进行编码转换。
但结果输出总是乱码。原来铁道部的网站首页进行了跳转,下面是铁道部的首页的源码:
<html><head><title>铁路客户服务中心</title><head><script lang="JAVASCRIPT">var url = location.host;if(url=="www.12306.cn"){window.location="/mormhweb/";}else{if(url=="wap.12306.cn"){window.location="/mormhwap/";}else{alert("非法的地址,浏览器将关闭!");window.close();}}</script></html>
首页的页面编码方式实际上是GBK,是我经过测试才知道的。在它的首页源文件中是看不到编码方式的。
最开始我是用
if(preg_match("/charset=gb2312\"/",strtolower($PageCode))==1) $PageCode=mb_convert_encoding($PageCode,"UTF-8","gb2312"); if(preg_match("/charset=gbk\"/",strtolower($PageCode))==1) $PageCode=mb_convert_encoding($PageCode,"UTF-8","gbk");
来进行编码判断并转换的,但有少数页面根本不行。因为页面上没有charset=gbk之类的,所以得通过其他方式进行编码判断。
下面有种方法可以直接判断字符串的编码是否为utf-8:
function is_utf8($liehuo_net) { if (preg_match("/^([".chr(228)."-".chr(233)."]{1}[".chr(128)."-".chr(191)."]{1}[".chr(128)."-".chr(191)."]{1}){1}/",$liehuo_net) == true || preg_match("/([".chr(228)."-".chr(233)."]{1}[".chr(128)."-".chr(191)."]{1}[".chr(128)."-".chr(191)."]{1}){1}$/",$liehuo_net) == true || preg_match("/([".chr(228)."-".chr(233)."]{1}[".chr(128)."-".chr(191)."]{1}[".chr(128)."-".chr(191)."]{1}){2,}/",$liehuo_net) == true) { return true; } else { return false; }}
于是可以这样进行编码判断并转换:
if(is_utf8($PageCode)!=1) { $PageCode=mb_convert_encoding($PageCode,"UTF-8","GBK");}
另外,在测试过程中,我把上面$PageCode=mb_convert_encoding($PageCode,"UTF-8","GBK");这句话改成$PageCode = iconv("UTF-8","gbk",$PageCode);
结果是乱码。虽然iconv的执行效率比mb_convert_encoding高,但是通用性和稳定性没有mb_convert_encoding好,所以牺牲一点效率,来换取更稳定的效果。
2.
$PageCode=file_get_contents("http://www.sohu.com");$PageCode=mb_convert_encoding($PageCode,"UTF-8","GBK");echo $PageCode;
因为搜狐的编码是GBK,而我的页面编码是utf-8,所以要进行编码转换。但结果还是乱码!我用各种编码方式来转换结果都是乱码。伤透了我的心。
后来在网上看到别人自己写了个类似linux下面的curl的函数:
function curl_file_get_contents($durl){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $durl); curl_setopt($ch, CURLOPT_TIMEOUT, 5); curl_setopt($ch, CURLOPT_USERAGENT, _USERAGENT_); curl_setopt($ch, CURLOPT_REFERER,_REFERER_); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $r = curl_exec($ch); curl_close($ch); return $r;}
于是我用这个函数试了一下$PageCode=curl_file_get_contents("http://www.sohu.com");,结果OK!
让我很不明白的是,为什么用php的函数file_get_contents得到的搜狐的首页源文件编码总是有问题呢?而用curl方式得到的就木有问题?
问题算是解决了,但是有些地方还不是很明白,不知道是怎么回事,权且先记下来,以后再慢慢深究。
- 网页中的编码问题,编码转换问题,以及file_get_contents
- 网页中的编码问题
- 爬取网页数据 编码转换问题
- php file_get_contents获取网页内容gzip编码导致的乱码问题
- 网页页面编码问题
- 网页编码问题
- html网页编码问题
- 网页编码的问题
- 解决dos中的乱码以及编码问题
- DOS中的乱码以及编码的问题
- 安卓中的乱码以及编码问题
- NIO中的编码以及解码问题
- 响应中的编码转换问题总结
- c#开发中的编码转换问题
- Python中的字符串与字符编码:编码和转换问题
- Python中的字符串与字符编码:编码和转换问题
- 字符集编码转换问题
- 字符编码转换问题
- 在Android中使用Timer,并创建一个应用程序
- JAVA程序员必看的15本书
- Oracle触发器
- 软件开发工具推荐 :Gow
- VC++ 反汇编定位程序崩溃位置
- 网页中的编码问题,编码转换问题,以及file_get_contents
- json解析类
- 字符串全攻略
- 使用 /proc 文件系统来访问 Linux 内核的内容
- Latex并列图形(不是subfigure)的画法,需要用到figure和minipage
- ORACLE PL/SQL编程之八: 把触发器说透
- AS3框架Robotlegs介绍,第一部分:Context和Mediators
- 亲子游
- apache的安全增强配置(使用mod_chroot,mod_security)