网页中的编码问题,编码转换问题,以及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方式得到的就木有问题?
问题算是解决了,但是有些地方还不是很明白,不知道是怎么回事,权且先记下来,以后再慢慢深究。