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

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

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

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

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

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

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

 

其实是中文的

深圳电视台《正午30分》

 

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

 

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

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

 

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

 

在网上搜索如下函数

 

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);
}

 

用了一下,感觉还行。

 

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

 

好像功能要强大一些

 

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,个人觉得应该通用性更好吧。

 

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;
}

 

 

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值