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加密解密的代码
Jul 16 PHP
How do I change MySQL timezone?
Mar 26 PHP
Apache+php+mysql在windows下的安装与配置图解(最新版)
Nov 30 PHP
ThinkPHP3.0略缩图不能保存到子目录的解决方法
Sep 30 PHP
php带抄送和密件抄送的邮件发送方法
Mar 20 PHP
php根据日期显示所在星座的方法
Jul 13 PHP
Thinkphp单字母函数使用指南
May 08 PHP
thinkphp3.2实现在线留言提交验证码功能
Jul 19 PHP
php+redis实现商城秒杀功能
Nov 19 PHP
php获取手机端的号码以及ip地址实例代码
Sep 12 PHP
PDO::getAvailableDrivers讲解
Jan 28 PHP
PDO::lastInsertId讲解
Jan 29 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检测apache mod_rewrite模块是否安装的方法
2015/03/14 PHP
php 生成Tab键或逗号分隔的CSV
2016/09/24 PHP
PHP图片添加水印功能示例小结
2016/10/03 PHP
PHP编程实现脚本异步执行的方法
2017/08/09 PHP
最新28个很棒的jQuery 教程
2011/05/28 Javascript
Extjs中的GridPanel隐藏列会显示在menuDisabled中解决方法
2013/01/27 Javascript
Javascript/Jquery——简单定时器的多种实现方法
2013/07/03 Javascript
jQuery表格插件ParamQuery简单使用方法示例
2013/12/05 Javascript
jquery 提示信息显示后自动消失的具体实现
2013/12/18 Javascript
浅谈jquery.fn.extend与jquery.extend区别
2015/07/13 Javascript
jQuery实现图片局部放大镜效果
2016/03/17 Javascript
1秒50万字!js实现关键词匹配
2016/08/01 Javascript
jQuery弹出窗口简单实现代码
2017/03/09 Javascript
利用Angular2 + Ionic3开发IOS应用实例教程
2018/01/15 Javascript
基于vue 开发中出现警告问题去除方法
2018/01/25 Javascript
详解webpack模块化管理和打包工具
2018/04/21 Javascript
基于Vue 实现一个中规中矩loading组件
2019/04/03 Javascript
vue + node如何通过一个Txt文件批量生成MP3并压缩成Zip
2020/06/02 Javascript
三步搞定:Vue.js调用Android原生操作
2020/09/07 Javascript
在Python中的Django框架中进行字符串翻译
2015/07/27 Python
Python+tkinter使用40行代码实现计算器功能
2018/01/30 Python
Python Selenium参数配置方法解析
2020/01/19 Python
python访问hdfs的操作
2020/06/06 Python
Python单元测试及unittest框架用法实例解析
2020/07/09 Python
Python使用Selenium模拟浏览器自动操作功能
2020/09/08 Python
玩具反斗城葡萄牙官方商城:Toys"R"Us葡萄牙
2016/10/21 全球购物
英国电子产品购物网站:TobyDeals
2018/07/30 全球购物
大专生自我评价
2014/01/28 职场文书
2014年秋季开学演讲稿
2014/05/24 职场文书
党校学习心得体会范文
2014/09/09 职场文书
财务助理岗位职责范本
2014/10/09 职场文书
2015年学校心理健康教育工作总结
2015/05/11 职场文书
2015年党支部书记工作总结
2015/05/21 职场文书
深入理解Vue的数据响应式
2021/05/15 Vue.js
如何在CSS中绘制曲线图形及展示动画
2021/05/24 HTML / CSS
CSS极坐标的实例代码
2021/06/03 HTML / CSS