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 设计模式之 单例模式
Dec 19 PHP
php简单定时执行任务的实现方法
Feb 23 PHP
PHP实现简单的新闻发布系统实例
Jul 28 PHP
PHP 实现的将图片转换为TXT
Oct 21 PHP
一个简单至极的PHP缓存类代码
Oct 23 PHP
centos 7.2下搭建LNMP环境教程
Nov 20 PHP
PHP数组相加操作及与array_merge的区别浅析
Nov 26 PHP
分析php://output和php://stdout的区别
May 06 PHP
Laravel框架实现利用监听器进行sql语句记录功能
Jun 06 PHP
PHP实现获取url地址中顶级域名的方法示例
Jun 05 PHP
PHP实现一个限制实例化次数的类示例
Sep 16 PHP
THINKPHP-Apache服务器中使用Alias虚拟目录URL重写 隐藏index.php
Mar 09 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 MySQL应用中使用XOR运算加密算法分享
2011/08/28 PHP
基于PHP的简单采集数据入库程序
2014/07/30 PHP
codeigniter显示所有脚本执行时间的方法
2015/03/21 PHP
解决yii2左侧菜单子级无法高亮问题的方法
2016/05/08 PHP
php PDO属性设置与操作方法分析
2018/12/27 PHP
浅谈Javascript鼠标和滚轮事件
2012/06/27 Javascript
javascript仿qq界面的折叠菜单实现代码
2012/12/12 Javascript
javascript实现网页中涉及的简易运动(改变宽高、透明度、位置)
2015/11/29 Javascript
修改ligerui 默认确认按钮的方法
2016/12/27 Javascript
Node.js中文件操作模块File System的详细介绍
2017/01/05 Javascript
nodeJS实现简单网页爬虫功能的实例(分享)
2017/06/08 NodeJs
使用JavaScript实现表格编辑器(实例讲解)
2017/08/02 Javascript
react-native中ListView组件点击跳转的方法示例
2017/09/30 Javascript
Vue中在新窗口打开页面及Vue-router的使用
2018/06/13 Javascript
vue 获取视频时长的实例代码
2019/08/20 Javascript
vue父子组件通信的高级用法示例
2019/08/29 Javascript
JS实现进度条动态加载特效
2020/03/25 Javascript
使用Python的Twisted框架实现一个简单的服务器
2015/04/16 Python
pandas 快速处理 date_time 日期格式方法
2018/11/12 Python
django 使用全局搜索功能的实例详解
2019/07/18 Python
Python logging模块进行封装实现原理解析
2020/08/07 Python
GoDaddy英国:全球排名第一的域名注册商
2018/06/08 全球购物
实习期自我鉴定
2013/10/11 职场文书
语文教育专业应届生求职信
2013/11/23 职场文书
电子商务专业个人的自我评价
2013/12/19 职场文书
好人好事事迹材料
2014/02/12 职场文书
美容院营销方案
2014/03/05 职场文书
幼儿园招生广告
2014/03/19 职场文书
消防标语大全
2014/06/07 职场文书
销售员岗位职责
2014/06/09 职场文书
环保宣传标语
2014/06/12 职场文书
运动会横幅标语
2014/06/17 职场文书
2015年市场部工作总结
2015/04/30 职场文书
征求意见函
2015/06/05 职场文书
监护人证明
2015/06/19 职场文书
学校中层领导培训心得体会
2016/01/11 职场文书