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 命令行参数详解及应用
May 18 PHP
初学PHP的朋友 经常问的一些问题。不断更新
Aug 11 PHP
PHP 字符串长度判断效率更高的方法
Mar 02 PHP
从刷票了解获得客户端IP的方法
Sep 21 PHP
crontab无法执行php的解决方法
Jan 25 PHP
PHP仿qq空间或朋友圈发布动态、评论动态、回复评论、删除动态或评论的功能(上)
May 26 PHP
PHP微信开发之微信录音临时转永久存储
Jan 26 PHP
PHP ADODB生成HTML表格函数rs2html功能【附错误处理函数用法】
May 29 PHP
php操作mongodb封装类与用法实例
Sep 01 PHP
PHP利用百度ai实现文本和图片审核
May 08 PHP
gearman中任务的优先级和返回状态实例分析
Feb 27 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原生模板引擎 最简单的模板引擎
2012/04/25 PHP
ThinkPHP3.1查询语言详解
2014/06/19 PHP
php使用CURL伪造IP和来源实例详解
2015/01/15 PHP
PHP数据库表操作的封装类及用法实例详解
2016/07/12 PHP
PHP与jquery实时显示网站在线人数实例详解
2016/12/02 PHP
PHP attributes()函数讲解
2019/02/03 PHP
Laravel重定向,a链接跳转,控制器跳转示例
2019/10/22 PHP
PHP数组对象与Json转换操作实例分析
2019/10/22 PHP
JavaScript 字符串乘法
2009/08/20 Javascript
基于Jquery实现的一个图片滚动切换
2012/06/21 Javascript
全面理解JavaScript中的闭包
2016/05/12 Javascript
浅析Bootstrap表格的使用
2016/06/23 Javascript
JS获取及验证开始结束日期的方法
2016/08/20 Javascript
jQuery使用Layer弹出层插件闪退问题
2016/12/22 Javascript
jQuery实现数字自动增加或者减少的动画效果示例
2018/12/11 jQuery
巧妙运用v-model实现父子组件传值的方法示例
2019/04/07 Javascript
Javascript 对象(object)合并操作实例分析
2019/07/30 Javascript
vue渲染方式render和template的区别
2020/06/05 Javascript
使用Python实现博客上进行自动翻页
2017/08/23 Python
Python根据指定日期计算后n天,前n天是哪一天的方法
2018/05/29 Python
Python使用pylab库实现绘制直方图功能示例
2018/06/01 Python
对python读写文件去重、RE、set的使用详解
2018/12/11 Python
Python DataFrame一列拆成多列以及一行拆成多行
2019/08/06 Python
通过实例解析Python RPC实现原理及方法
2020/07/07 Python
Python浮点型(float)运算结果不正确的解决方案
2020/09/22 Python
HTML5+WebSocket实现多文件同时上传的实例
2016/12/29 HTML / CSS
东方通信股份有限公司VC面试题
2014/08/27 面试题
简历中自我评价范文3则
2013/12/14 职场文书
试用期转正鉴定评语
2014/01/27 职场文书
毕业生求职信的经典写法
2014/01/31 职场文书
2014市府办领导班子“四风问题”对照检查材料思想汇报
2014/09/24 职场文书
技术入股合作协议书
2014/10/07 职场文书
2015年企业新年寄语
2014/12/08 职场文书
英文产品推荐信
2015/03/27 职场文书
SpringBoot系列之MongoDB Aggregations用法详解
2022/02/12 MongoDB
springboot读取resources下文件的方式详解
2022/06/21 Java/Android