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 一个页面执行时间类代码
Mar 05 PHP
Admin generator, filters and I18n
Oct 06 PHP
ThinkPHP的截取字符串函数无法显示省略号的解决方法
Jun 25 PHP
php自定义urlencode,urldecode函数实例
Mar 24 PHP
php简单判断两个字符串是否相等的方法
Jul 13 PHP
PHP生成随机字符串(3种方法)
Sep 25 PHP
PHP常用的小程序代码段
Nov 14 PHP
Yii2简单实现给表单添加验证码的方法
Jul 18 PHP
PHP基于GD库的图像处理方法小结
Sep 27 PHP
Laravel框架生命周期与原理分析
Jun 12 PHP
php设计模式之策略模式应用案例详解
Jun 17 PHP
Yii框架where查询用法实例分析
Oct 22 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
基于OpenCV的PHP图像人脸识别技术
2009/10/11 PHP
腾讯QQ微博API接口获取微博内容
2013/10/30 PHP
php文件操作相关类实例
2015/06/18 PHP
屏蔽PHP默认设置中的Notice警告的方法
2016/05/20 PHP
编写跨浏览器的javascript代码必备[js多浏览器兼容写法]
2008/10/29 Javascript
基于JavaScript实现继承机制之调用call()与apply()的方法详解
2013/05/07 Javascript
JSCode all of Brower 全局屏蔽网页右键功能 具体实现
2013/06/05 Javascript
JQuery为页面Dom元素绑定事件及解除绑定方法
2014/04/23 Javascript
jquery实现更改表格行顺序示例
2014/04/30 Javascript
jQuery固定浮动侧边栏实现思路及代码
2014/09/28 Javascript
AngularJS控制器controller正确的通信的方法
2016/01/25 Javascript
jquery基础知识第一讲之认识jquery
2016/03/17 Javascript
基于jquery实现最简单的选项卡切换效果
2016/05/08 Javascript
AngularJs $parse、$eval和$observe、$watch详解
2016/09/21 Javascript
微信小程序实现富文本图片宽度自适应的方法
2019/01/20 Javascript
解决vue中使用proxy配置不同端口和ip接口问题
2019/08/14 Javascript
原生js实现贪食蛇小游戏的思路详解
2019/11/26 Javascript
[02:01]大师之路——DOTA2完美大师赛11月论剑上海
2017/11/06 DOTA
[39:19]完美世界DOTA2联赛PWL S2 SZ vs LBZS 第二场 11.26
2020/11/30 DOTA
Python socket网络编程TCP/IP服务器与客户端通信
2017/01/05 Python
Python3中简单的文件操作及两个简单小实例分享
2017/06/18 Python
对Python多线程读写文件加锁的实例详解
2019/01/14 Python
什么是python的列表推导式
2020/05/26 Python
Python 使用Opencv实现目标检测与识别的示例代码
2020/09/08 Python
如何配置、使用和清除Smarty缓存
2015/12/23 面试题
电信专业毕业生推荐信
2013/11/18 职场文书
中式餐厅创业计划书范文
2014/01/23 职场文书
大学生先进事迹材料
2014/02/16 职场文书
创建省级文明单位实施方案
2014/02/27 职场文书
施工协议书范本
2014/04/22 职场文书
学校清明节活动总结
2014/07/04 职场文书
党员对照检查材料思想汇报
2014/09/16 职场文书
离婚协议书范本及离婚须知
2014/10/15 职场文书
2015年药店店长工作总结
2015/04/29 职场文书
教研活动主持词
2015/07/03 职场文书
银行求职信范文
2019/05/13 职场文书