文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>解决新浪抓取资料文字乱码 php字符转码

解决新浪抓取资料文字乱码 php字符转码

时间:2010-06-30  来源:xhq6632

因为工作原因,时常用到抓取程序。

比较像迅雷、电驴、新浪等。

最好发现一个现在,就是新浪上的资料抓取回来之后,发现是乱码。

经过仔细对比,不是乱码。

原来是新浪对所以文字作了编码处理

%u6df1%u5733%u7535%u89c6%u53f0%u300a%u6b63%u534830%u5206%u300b

 

其实是中文的

深圳电视台《正午30分》

 

在网上找了一堆相关的东西。发js的unescape刚好可以解决这个问题。一阵狂喜。

 

淡定之后,发现。不能使用。

因为我的程序中,要用PHP来处理入库问题,不用能js来帮忙吧

 

网上搜索了一番,发现还真有不少人遇到类似问题。

 

在网上搜索如下函数

 

Php代码
  1. function unescape($str) {   
  2.   $str = rawurldecode($str);   
  3.   preg_match_all("/(?:%u.{4})|.+/",$str,$r);   
  4.   $ar = $r[0];   
  5.   foreach($ar as $k=>$v) {   
  6.     if(substr($v,0,2) == '%u' && strlen($v) == 6)   
  7.       $ar[$k] = iconv("UCS-2","utf-8",pack("H4",substr($v,-4)));   
  8.   }   
  9.   return join("",$ar);   
  10. }  
function unescape($str) {
  $str = rawurldecode($str);
  preg_match_all("/(?:%u.{4})|.+/",$str,$r);
  $ar = $r[0];
  foreach($ar as $k=>$v) {
    if(substr($v,0,2) == '%u' && strlen($v) == 6)
      $ar[$k] = iconv("UCS-2","utf-8",pack("H4",substr($v,-4)));
  }
  return join("",$ar);
}

 

用了一下,感觉还行。

 

后来发现有点小问题,又换一个函数

 

好像功能要强大一些

 

Php代码
  1. function unescape($str) {   
  2.   $str = rawurldecode($str);   
  3.   preg_match_all("/%u.{4}|&#x.{4};|&#\d+;|&#\d+?|.+/U",$str,$r);   
  4.   $ar = $r[0];   
  5.   foreach($ar as $k=>$v) {   
  6.   if(substr($v,0,2) == "%u")   
  7.   $ar[$k] = iconv("UCS-2","utf-8",pack("H4",substr($v,-4)));   
  8.   elseif(substr($v,0,3) == "&#x")   
  9.   $ar[$k] = iconv("UCS-2","utf-8",pack("H4",substr($v,3,-1)));   
  10.   elseif(substr($v,0,2) == "&#") {   
  11.   $ar[$k] = iconv("UCS-2","utf-8",pack("n",preg_replace("/[^\d]/","",$v)));   
  12.   }   
  13. }   
  14. return join("",$ar);   
  15. }  
function unescape($str) {
  $str = rawurldecode($str);
  preg_match_all("/%u.{4}|&#x.{4};|&#\d+;|&#\d+?|.+/U",$str,$r);
  $ar = $r[0];
  foreach($ar as $k=>$v) {
  if(substr($v,0,2) == "%u")
  $ar[$k] = iconv("UCS-2","utf-8",pack("H4",substr($v,-4)));
  elseif(substr($v,0,3) == "&#x")
  $ar[$k] = iconv("UCS-2","utf-8",pack("H4",substr($v,3,-1)));
  elseif(substr($v,0,2) == "&#") {
  $ar[$k] = iconv("UCS-2","utf-8",pack("n",preg_replace("/[^\d]/","",$v)));
  }
}
return join("",$ar);
}

 

感觉要好一些。

 

但是用了一段时间,发现在本地可以使用,但是我们的线上环境不能够使用

找了半天,不知道是何原因。

对比一下,

其实就是线上是*nux,本地是XP了

还有,就是PHP版本不一样了。

 

后来,又在手册里面发现有一个类似的函数

而且还支持utf8,个人觉得应该通用性更好吧。

 

Php代码
  1. function utf8RawUrlDecode ($source) {   
  2.    $decodedStr = "";   
  3.    $pos = 0;   
  4.    $len = strlen ($source);   
  5.    while ($pos < $len) {   
  6.        $charAt = substr ($source, $pos, 1);   
  7.        if ($charAt == '%') {   
  8.            $pos++;   
  9.            $charAt = substr ($source, $pos, 1);   
  10.            if ($charAt == 'u') {   
  11.                // we got a unicode character   
  12.                $pos++;   
  13.                $unicodeHexVal = substr ($source, $pos, 4);   
  14.                $unicode = hexdec ($unicodeHexVal);   
  15.                $entity = "&#". $unicode . ';';   
  16.                $decodedStr .= utf8_encode ($entity);   
  17.                $pos += 4;   
  18.            }   
  19.            else {   
  20.                // we have an escaped ascii character   
  21.                $hexVal = substr ($source, $pos, 2);   
  22.                $decodedStr .= chr (hexdec ($hexVal));   
  23.                $pos += 2;   
  24.            }   
  25.        } else {   
  26.            $decodedStr .= $charAt;   
  27.            $pos++;   
  28.        }   
  29.    }   
  30.    return $decodedStr;   
  31. }  
function utf8RawUrlDecode ($source) {
   $decodedStr = "";
   $pos = 0;
   $len = strlen ($source);
   while ($pos < $len) {
       $charAt = substr ($source, $pos, 1);
       if ($charAt == '%') {
           $pos++;
           $charAt = substr ($source, $pos, 1);
           if ($charAt == 'u') {
               // we got a unicode character
               $pos++;
               $unicodeHexVal = substr ($source, $pos, 4);
               $unicode = hexdec ($unicodeHexVal);
               $entity = "&#". $unicode . ';';
               $decodedStr .= utf8_encode ($entity);
               $pos += 4;
           }
           else {
               // we have an escaped ascii character
               $hexVal = substr ($source, $pos, 2);
               $decodedStr .= chr (hexdec ($hexVal));
               $pos += 2;
           }
       } else {
           $decodedStr .= $charAt;
           $pos++;
       }
   }
   return $decodedStr;
}

 

 

呵呵,果然,这个函数。解决了线上问题。

记录下来,以后好查询哈。

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载