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 相关文章推荐
php5 pdo新改动加载注意事项
Sep 11 PHP
PHP表单提交表单名称含有点号(.)则会被转化为下划线(_)
Dec 14 PHP
在PHP中设置、使用、删除Cookie的解决方法
May 06 PHP
codeigniter教程之多文件上传使用示例
Feb 11 PHP
PHP遍历文件夹与文件类及处理类用法实例
Sep 23 PHP
PHP编程入门的基本语法知识点总结
Jan 26 PHP
ThinkPHP中类的构造函数_construct()与_initialize()的区别详解
Mar 13 PHP
PHP实现UTF8二进制及明文字符串的转化功能示例
Nov 20 PHP
tp框架(thinkPHP)实现三次登陆密码错误之后锁定账号功能示例
May 24 PHP
PHP单文件上传原理及上传函数的封装操作示例
Sep 02 PHP
php实现的数组转xml案例分析
Sep 28 PHP
php实现JWT验证的实例教程
Nov 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连接SQLSERVER 注意事项(附dll文件下载)
2012/06/28 PHP
PHP分页详细讲解(有实例)
2013/10/30 PHP
[原创]ThinkPHP中SHOW_RUN_TIME不能正常显示运行时间的解决方法
2015/10/10 PHP
深入浅析yii2-gii自定义模板的方法
2016/04/26 PHP
Joomla数据库操作之JFactory::getDBO用法
2016/05/05 PHP
JavaScript中的Document文档对象
2008/01/16 Javascript
比较全面的event对像在IE与FF中的区别 推荐
2009/09/21 Javascript
基于Jquery制作的幻灯片图集效果打包下载
2011/02/12 Javascript
js无刷新操作table的行和列
2014/03/27 Javascript
Jquery方式获取iframe页面中的 Dom元素
2014/05/07 Javascript
JavaScript中操作字符串之localeCompare()方法的使用
2015/06/06 Javascript
javascript中的Function.prototye.bind
2015/06/25 Javascript
jQuery解决$符号命名冲突
2016/06/18 Javascript
jQuery实现的纵向下拉菜单实例详解【附demo源码下载】
2016/07/09 Javascript
ES6通过babel转码使用webpack使用import关键字
2016/12/13 Javascript
漂亮实用的页面loading(加载)封装代码
2017/02/03 Javascript
JS中去掉array中重复元素的方法
2017/05/26 Javascript
vue加载自定义的js文件方法
2018/03/13 Javascript
vue删除html内容的标签样式实例
2018/09/13 Javascript
对angularjs框架下controller间的传值方法详解
2018/10/08 Javascript
每周一练 之 数据结构与算法(Stack)
2019/04/16 Javascript
史上最为详细的javascript继承(推荐)
2019/05/18 Javascript
jQuery实现input[type=file]多图预览上传删除等功能
2019/08/02 jQuery
jQuery实现的移动端图片缩放功能组件示例
2020/05/01 jQuery
在vue中使用inheritAttrs实现组件的扩展性介绍
2020/12/07 Vue.js
python中pandas.DataFrame对行与列求和及添加新行与列示例
2017/03/12 Python
python批量修改图片后缀的方法(png到jpg)
2018/10/25 Python
解决python Markdown模块乱码的问题
2019/02/14 Python
python des,aes,rsa加解密的实现
2021/01/16 Python
美体小铺美国官网:The Body Shop美国
2017/11/10 全球购物
《童趣》教学反思
2014/02/19 职场文书
房屋出租协议书
2014/04/10 职场文书
2014年安全生产责任书
2014/07/22 职场文书
公路局群众路线教育实践活动第一阶段工作汇报
2014/10/25 职场文书
2015年护士节活动策划方案
2015/05/04 职场文书
Python 文字识别
2022/05/11 Python