最近在做PHP时遇到一个需求,要求服务器端根据传入的url返回页面的源代码。但是由于url是未知的,所以返回的源代码的编码也未知,如果没有做转码的话,遇到中文就会返回乱码。那么能不能让PHP自动判定内容的编码,并自动转换为UTF-8呢?
解决方案
既然有了需求,就要有对应的解决方案
- 根据URL获取源代码
- PHP判断返回源代码的编码格式
- 如果不是UTF-8编码,转码为UTF-8
- 返回转码后的结果
获取源代码
这里用file_get_contents
进行获取
function getContent($url){ //设置请求头 $opts = array( 'http'=>array( 'method'=>"GET", 'header'=>"Accept-language: zh-cn\r\n". "referer:$url\r\n", 'timeout'=>"8", ) ); $context = stream_context_create($opts); //获取数据并返回 return file_get_contents($url,false,$context); }
自动转换格式
这里使用mb_detect_encoding
进行字符编码判断。后边的数组列举了可能的编码,程序会依次判定,注意要将UTF-8放到最后。
$encode = mb_detect_encoding($html, array('ASCII','GB2312','GBK','UTF-8')); if($encode != 'UTF-8'){ $html = iconv( $encode,"utf-8",$html); } echo $html;
完整代码
<?php $url = $_GET['url']; function getContent($url) { $opts = array( 'http'=>array( 'method'=>"GET", 'header'=>"Accept-language: zh-cn\r\n". "referer:$url\r\n", 'timeout'=>"8", ) ); $context = stream_context_create($opts); return file_get_contents($url,false,$context); } $html = getContent($url); $encode = mb_detect_encoding($html, array('ASCII','GB2312','GBK','UTF-8')); if($encode != 'UTF-8'){ $html = iconv( $encode,"utf-8",$html); } echo $html;