`
xhq6632
  • 浏览: 13269 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类

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

    博客分类:
  • 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;
}

 

 

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

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

分享到:
评论

相关推荐

    用javascript解决外部数据抓取中的乱码问题

    如果外部数据是gb2312编码的,就涉及到转码的问题,但是传统的用vbs函数进行处理的方法,运算量比较大,有些特殊字符还会出错。 如果用adodb.stream控件来进行转码,就简单多了,不需要借助vbs的二进制处理函数了,...

    java转码工具

    2. 在处理来自不同编码来源的数据时,如从网页抓取的文本、电子邮件、数据库记录等,转码可以确保正确显示所有字符。 3. 当需要将中文文件上传到支持UTF-8编码的服务器或平台时,转码工具可以帮助避免编码不兼容问题...

    python抓取并保存html页面时乱码问题的解决方法

    在Python中进行网络爬虫时,常常会遇到HTML页面抓取后出现乱码的问题。这个问题主要源于两个方面:一是代码中处理字符编码的方式不正确,二是网页的实际编码与声明的编码不符。解决这类问题的关键在于正确识别和处理...

    C# webclient中文乱码问题解决方法

    本文将深入探讨如何解决使用WebClient类抓取远程页面时遇到的中文乱码问题。 首先,我们要理解乱码的根源。乱码通常发生在两种情况之一:一是数据在传输过程中编码不一致,二是解码时使用的编码与实际编码不符。在...

    python抓取网页时字符集转换问题处理方案分享

    这时候需要制定字符串的编码,如果采集网页的编码是gb2312,而我们的数据库是utf-8的,这样不做任何处理直接插入数据库可能会乱码(没测试过,不知道数据库会不会自动转码),我们需要手动将gb2312转换成utf-8。...

    gbsetup.exe

    尽管对于源程序中极个别字符仍需人工校验,但已转码的VFP软件界面风格不变,编译成exe后运行顺畅与原版无异。 友情提示:转码前务必备份好原件,避免发生意外损坏。同时为便于调试,建议安装WINDOWS繁体和简体中文...

    浅析php插件 Simple HTML DOM 用DOM方式处理HTML

    在PHP编程中,处理HTML文档是一项常见的任务,尤其是在进行网页抓取或网页内容解析时。Simple HTML DOM是一个方便的PHP插件,它提供了一个简单的接口,让我们能够使用DOM(Document Object Model)方式来操作HTML。...

    民航竞赛-网站安全12.pdf

    8. **iconv转码问题**:在使用iconv将UTF编码转为GB2312时,如果字符串中含有无法转换的字符,可能会导致字符串变乱码,选项C(字符串变乱码了)是正确答案。 9. **AngularJS**:AngularJS是一个前端JavaScript框架...

    linux系统上支持php的 iconv()函数的方法

    `iconv()`函数在PHP中用于在不同字符编码之间进行转换,这对于处理多语言内容或从网络抓取的数据尤其有用。下面将详细解释如何在Linux环境下设置`iconv()`函数。 首先,你需要下载`libiconv`函数库,这是`iconv`...

    Node.js编写爬虫的基本思路及抓取百度图片的实例分享-.pdf

    在本文档中,作者分享了使用Node.js编写网络爬虫的基本步骤和具体实践,特别是针对抓取百度图片的实例。以下是对这些知识点的详细说明: 1. **HTTP请求与HTML解析**: - 发送HTTP请求:Node.js的内置`http`模块...

    易语言实例开发源码——新编码转换大全模块+应用例程().zip

    3. **易语言中的字符串处理**:易语言提供了丰富的字符串操作命令,如`取字节`、`转码`、`替换`等,用于处理和转换字符串的编码。 4. **新编码转换大全模块**:这个模块可能包含了一系列预定义的函数或子程序,用于...

Global site tag (gtag.js) - Google Analytics