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 相关文章推荐
在JavaScript中调用php程序
Mar 09 PHP
获取远程文件大小的php函数
Jan 11 PHP
一步一步学习PHP(2)――PHP类型
Feb 15 PHP
PHP中static关键字原理的学习研究分析
Jul 18 PHP
PHP中将ip地址转成十进制数的两种实用方法
Aug 15 PHP
关于php支持分块与断点续传文件下载功能代码
May 09 PHP
Codeigniter实现多文件上传并创建多个缩略图
Jun 12 PHP
WordPress中用于获取及自定义头像图片的PHP脚本详解
Dec 17 PHP
PHP多维数组转一维数组的简单实现方法
Dec 23 PHP
Windows下php+mysql5.7配置教程
May 16 PHP
浅谈php://filter的妙用
Mar 05 PHP
Laravel框架实现抢红包功能示例
Oct 31 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学习笔记 (1) 环境配置与代码调试
2011/06/19 PHP
php中如何防止表单的重复提交
2013/08/02 PHP
php生成rss类用法实例
2015/04/14 PHP
thinkphp5 加载静态资源路径与常量的方法
2017/12/24 PHP
微信JSSDK分享功能图文实例详解
2019/04/08 PHP
js 分栏效果实现代码
2009/08/29 Javascript
JQuery文本改变触发事件如聚焦事件、失焦事件
2014/01/15 Javascript
JavaScript实现仿网易通行证表单验证
2015/05/25 Javascript
JavaScript实现算术平方根算法-代码超简单
2015/09/11 Javascript
使用postMesssage()实现跨域iframe页面间的信息传递方法
2016/03/29 Javascript
js实现目录链接,内容跟着目录滚动显示的简单实例
2016/10/15 Javascript
Angular的MVC和作用域
2016/12/26 Javascript
bootstrap-table实现服务器分页的示例 (spring 后台)
2017/09/01 Javascript
解决layui前端框架 form表单,table表等内置控件不显示的问题
2018/08/19 Javascript
基于Koa(nodejs框架)对json文件进行增删改查的示例代码
2019/02/02 NodeJs
20道JS原理题助你面试一臂之力(必看)
2019/07/22 Javascript
layui给下拉框、按钮状态、时间赋初始值的方法
2019/09/10 Javascript
[01:10]DOTA2次级职业联赛 - Fly战队宣传片
2014/12/01 DOTA
多线程爬虫批量下载pcgame图片url 保存为xml的实现代码
2013/01/17 Python
在Python中操作时间之tzset()方法的使用教程
2015/05/22 Python
python简单实现旋转图片的方法
2015/05/30 Python
使用Python的Twisted框架构建非阻塞下载程序的实例教程
2016/05/25 Python
用Python将动态GIF图片倒放播放的方法
2016/11/02 Python
Python实现针对含中文字符串的截取功能示例
2017/09/22 Python
python 利用文件锁单例执行脚本的方法
2019/02/19 Python
深入了解如何基于Python读写Kafka
2019/12/31 Python
Tensorflow中的dropout的使用方法
2020/03/13 Python
通过代码实例了解Python sys模块
2020/09/14 Python
Python colormap库的安装和使用详情
2020/10/06 Python
澳大利亚在线百货商店:Real Smart
2017/08/13 全球购物
UGG澳洲官网:UGG Australia
2018/04/26 全球购物
企业后勤岗位职责
2014/02/28 职场文书
一个都不能少观后感
2015/06/04 职场文书
Nginx实现高可用集群构建(Keepalived+Haproxy+Nginx)
2021/05/27 Servers
MySQL 数据类型详情
2021/11/11 MySQL
Win11电脑显示本地时间与服务器时间不一致怎么解决?
2022/04/05 数码科技