因为工作原因,时常用到抓取程序。
比较像迅雷、电驴、新浪等。
最好发现一个现在,就是新浪上的资料抓取回来之后,发现是乱码。
经过仔细对比,不是乱码。
原来是新浪对所以文字作了编码处理
%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;
}
呵呵,果然,这个函数。解决了线上问题。
记录下来,以后好查询哈。
分享到:
相关推荐
如果外部数据是gb2312编码的,就涉及到转码的问题,但是传统的用vbs函数进行处理的方法,运算量比较大,有些特殊字符还会出错。 如果用adodb.stream控件来进行转码,就简单多了,不需要借助vbs的二进制处理函数了,...
2. 在处理来自不同编码来源的数据时,如从网页抓取的文本、电子邮件、数据库记录等,转码可以确保正确显示所有字符。 3. 当需要将中文文件上传到支持UTF-8编码的服务器或平台时,转码工具可以帮助避免编码不兼容问题...
在Python中进行网络爬虫时,常常会遇到HTML页面抓取后出现乱码的问题。这个问题主要源于两个方面:一是代码中处理字符编码的方式不正确,二是网页的实际编码与声明的编码不符。解决这类问题的关键在于正确识别和处理...
本文将深入探讨如何解决使用WebClient类抓取远程页面时遇到的中文乱码问题。 首先,我们要理解乱码的根源。乱码通常发生在两种情况之一:一是数据在传输过程中编码不一致,二是解码时使用的编码与实际编码不符。在...
这时候需要制定字符串的编码,如果采集网页的编码是gb2312,而我们的数据库是utf-8的,这样不做任何处理直接插入数据库可能会乱码(没测试过,不知道数据库会不会自动转码),我们需要手动将gb2312转换成utf-8。...
尽管对于源程序中极个别字符仍需人工校验,但已转码的VFP软件界面风格不变,编译成exe后运行顺畅与原版无异。 友情提示:转码前务必备份好原件,避免发生意外损坏。同时为便于调试,建议安装WINDOWS繁体和简体中文...
在PHP编程中,处理HTML文档是一项常见的任务,尤其是在进行网页抓取或网页内容解析时。Simple HTML DOM是一个方便的PHP插件,它提供了一个简单的接口,让我们能够使用DOM(Document Object Model)方式来操作HTML。...
8. **iconv转码问题**:在使用iconv将UTF编码转为GB2312时,如果字符串中含有无法转换的字符,可能会导致字符串变乱码,选项C(字符串变乱码了)是正确答案。 9. **AngularJS**:AngularJS是一个前端JavaScript框架...
`iconv()`函数在PHP中用于在不同字符编码之间进行转换,这对于处理多语言内容或从网络抓取的数据尤其有用。下面将详细解释如何在Linux环境下设置`iconv()`函数。 首先,你需要下载`libiconv`函数库,这是`iconv`...
在本文档中,作者分享了使用Node.js编写网络爬虫的基本步骤和具体实践,特别是针对抓取百度图片的实例。以下是对这些知识点的详细说明: 1. **HTTP请求与HTML解析**: - 发送HTTP请求:Node.js的内置`http`模块...
3. **易语言中的字符串处理**:易语言提供了丰富的字符串操作命令,如`取字节`、`转码`、`替换`等,用于处理和转换字符串的编码。 4. **新编码转换大全模块**:这个模块可能包含了一系列预定义的函数或子程序,用于...