PHP解析html类库simple_html_dom的转码bug


Posted in PHP onMay 22, 2014

这几天有在用simple_html_dom抓一些文章。不同网站的编码在国内基本上是gbk gb2312 utf-8。而以gb2312和utf-8居多。

我这一版的simple_html_dom有一个方法 convert_text 是这个样子的。

 // PaperG - Function to convert the text from one character set to another if the two sets are not the same.
 function convert_text($text)
 {
  global $debug_object;
  if (is_object($debug_object)) {$debug_object->debug_log_entry(1);}
  $converted_text = $text;
  $sourceCharset = "";
  $targetCharset = "";
  if ($this->dom)
  {
   $sourceCharset = strtoupper($this->dom->_charset);
   $targetCharset = strtoupper($this->dom->_target_charset);
  }
  if (is_object($debug_object)) {$debug_object->debug_log(3, "source charset: " . $sourceCharset . " target charaset: " . $targetCharset);}
  if (!empty($sourceCharset) && !empty($targetCharset) && (strcasecmp($sourceCharset, $targetCharset) != 0))
  {
   // Check if the reported encoding could have been incorrect and the text is actually already UTF-8
   if ((strcasecmp($targetCharset, 'UTF-8') == 0) && ($this->is_utf8($text)))
   {
    $converted_text = $text;
   }
   else
   {
    $converted_text = iconv($sourceCharset, $targetCharset, $text);
   }
  }
  // Lets make sure that we don't have that silly BOM issue with any of the utf-8 text we output.
  if ($targetCharset == 'UTF-8')
  {
   if (substr($converted_text, 0, 3) == "\xef\xbb\xbf")
   {
    $converted_text = substr($converted_text, 3);
   }
   if (substr($converted_text, -3) == "\xef\xbb\xbf")
   {
    $converted_text = substr($converted_text, 0, -3);
   }
  }
  return $converted_text;
 }

来看这一行:

    $converted_text = iconv($sourceCharset, $targetCharset, $text); 

会引起转码不正确。比如会把gb2312的文字转成:

4月26日在<span style="color:#C03">????lt;/span>公园马术场举行的2014浪琴国际马联场地障碍世界杯中国联赛资格赛上,24岁的韩壮壮不仅拿到零罚分的成绩 ...第7个出场的<span style="color:#C03">??浜?lt;/span>奥运骑手赵志文第一个收获零罚分,用时77秒07 ...

既成的事实了,证明里头的转码功能没有处理好。由于我使用这个simple_html_dom只是想要用来构建dom。我并没有打算花时间去很好地处理这个bug。而是简单地把

$converted_text = iconv($sourceCharset, $targetCharset, $text);

改成

$converted_text = $text;

就行了。思路就是取消它的转码。好吧工作不必纠结,可以继续了。

PHP 相关文章推荐
使用PHP制作新闻系统的思路
Oct 09 PHP
php cookis创建实现代码
Mar 16 PHP
深入php中var_dump方法的使用详解
Jun 24 PHP
php解决抢购秒杀抽奖等大流量并发入库导致的库存负数的问题
Jun 19 PHP
PHP使用GIFEncoder类处理gif图片实例
Jul 01 PHP
将FCKeditor导入PHP+SMARTY的实现方法
Jan 15 PHP
php语言中使用json的技巧及json的实现代码详解
Oct 27 PHP
PHP利用超级全局变量$_POST来接收表单数据的实例
Nov 05 PHP
如何利用预加载优化Laravel Model查询详解
Aug 11 PHP
Yii2.0实现的批量更新及批量插入功能示例
Jan 29 PHP
Laravel 集成微信用户登录和绑定的实现
Dec 27 PHP
php自动加载代码实例详解
Feb 26 PHP
浅谈discuz密码加密的方式
May 22 #PHP
PHP函数strip_tags的一个bug浅析
May 22 #PHP
PHP学习笔记之字符串编码的转换和判断
May 22 #PHP
PHP+memcache实现消息队列案例分享
May 21 #PHP
php+highchats生成动态统计图
May 21 #PHP
PhpDocumentor 2安装以及生成API文档的方法
May 21 #PHP
Smarty模板学习笔记之Smarty简介
May 20 #PHP
You might like
PHP微信模板消息操作示例
2017/06/29 PHP
ExtJS4中的requires使用方法示例介绍
2013/12/03 Javascript
利用Keydown事件阻止用户输入实现代码
2014/03/11 Javascript
Android中的jQuery:AQuery简介
2014/05/06 Javascript
js的for in循环和java里foreach循环的区别分析
2015/01/28 Javascript
Bootstrap每天必学之简单入门
2015/11/19 Javascript
javascript每日必学之基础入门
2016/02/16 Javascript
javascript实现一个简单的弹出窗
2016/02/22 Javascript
200行代码实现blockchain 区块链实例详解
2018/03/14 Javascript
layui获取选中行数据的实例讲解
2018/08/19 Javascript
vuejs中监听窗口关闭和窗口刷新事件的方法
2018/09/21 Javascript
用npm-run实现自动化任务的方法示例
2019/01/14 Javascript
autojs 蚂蚁森林能量自动拾取即给指定好友浇水的实现方法
2020/05/03 Javascript
python实现调用其他python脚本的方法
2014/10/05 Python
python检测远程udp端口是否打开的方法
2015/03/14 Python
python生成圆形图片的方法
2020/03/25 Python
Python实现的质因式分解算法示例
2018/05/03 Python
python安装模块如何通过setup.py安装(超简单)
2018/05/05 Python
使用pandas将numpy中的数组数据保存到csv文件的方法
2018/06/14 Python
解决Python 命令行执行脚本时,提示导入的包找不到的问题
2019/01/19 Python
python判断文件是否存在,不存在就创建一个的实例
2019/02/18 Python
numpy.random模块用法总结
2019/05/27 Python
Python3 列表,数组,矩阵的相互转换的方法示例
2019/08/05 Python
学习Django知识点分享
2019/09/11 Python
python多进程(加入进程池)操作常见案例
2019/10/21 Python
python 爬取腾讯视频评论的实现步骤
2021/02/18 Python
CSS3属性background-size使用指南
2014/12/09 HTML / CSS
施华洛世奇巴西官网:SWAROVSKI巴西
2019/12/03 全球购物
大学生水文观测实习自我鉴定
2013/09/29 职场文书
精彩的英文自荐信
2014/01/30 职场文书
幼儿园儿童节活动主持词+串词大全
2014/03/21 职场文书
毕业证委托书范文
2014/09/26 职场文书
党员学习群众路线心得体会
2014/11/04 职场文书
2015年环卫处个人工作总结
2015/07/27 职场文书
适合毕业生创业的项目怎么找?
2019/08/08 职场文书
使用Golang的channel交叉打印两个数组的操作
2021/04/29 Golang