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 相关文章推荐
BBS(php &amp; mysql)完整版(三)
Oct 09 PHP
小偷PHP+Html+缓存
Dec 20 PHP
Zend Studio (eclipse)使用速度优化方法
Mar 23 PHP
基于PHP创建Cookie数组的详解
Jul 03 PHP
php 检查电子邮件函数(自写)
Jan 16 PHP
PHP模板引擎Smarty的缓存使用总结
Apr 24 PHP
CI框架学习笔记(二) -入口文件index.php
Oct 27 PHP
PHP中cookie知识点学习
May 06 PHP
php使用curl_init()和curl_multi_init()多线程的速度比较详解
Aug 15 PHP
tp5框架使用composer实现日志记录功能示例
Jan 10 PHP
php5.6.x到php7.0.x特性小结
Aug 17 PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
Mar 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
Yii实现单用户博客系统文章详情页插入评论表单的方法
2015/12/28 PHP
PHP流Streams、包装器wrapper概念与用法实例详解
2017/11/17 PHP
鼠标拖动实现DIV排序示例代码
2013/10/14 Javascript
JavaScript实现下拉菜单的显示和隐藏
2016/01/05 Javascript
JS闭包、作用域链、垃圾回收、内存泄露相关知识小结
2016/05/16 Javascript
JS模态窗口返回值兼容问题的完美解决方法
2016/05/28 Javascript
JavaWeb表单及时验证功能在输入后立即验证(含用户类型,性别,爱好...的验证)
2017/06/09 Javascript
docker中编译nodejs并使用nginx启动
2017/06/23 NodeJs
jquery实现左右轮播切换效果
2018/01/01 jQuery
Node.js 实现远程桌面监控的方法步骤
2019/07/02 Javascript
js 实现watch监听数据变化的代码
2019/10/13 Javascript
JavaScript代理模式原理与用法实例详解
2020/03/10 Javascript
vue+axios 拦截器实现统一token的案例
2020/09/11 Javascript
[05:42]DOTA2英雄梦之声_第10期_蝙蝠骑士
2014/06/21 DOTA
[54:51]Ti4 冒泡赛第二轮LGD vs C9 3
2014/07/14 DOTA
通过数据库对Django进行删除字段和删除模型的操作
2015/07/21 Python
利用ctypes提高Python的执行速度
2016/09/09 Python
python下如何查询CS反恐精英的服务器信息
2017/01/17 Python
基于pip install django失败时的解决方法
2018/06/12 Python
Python实现绘制双柱状图并显示数值功能示例
2018/06/23 Python
对python pandas读取剪贴板内容的方法详解
2019/01/24 Python
基于腾讯云服务器部署微信小程序后台服务(Python+Django)
2019/05/08 Python
python网络编程 使用UDP、TCP协议收发信息详解
2019/08/29 Python
css3 图片圆形显示 如何CSS将正方形图片显示为圆形图片布局
2014/10/10 HTML / CSS
HTML块级标签汇总(小篇)
2016/07/13 HTML / CSS
英国花园家具中心:Garden Furniture Centre
2017/08/24 全球购物
Napapijri西班牙在线商店:夹克、外套、运动衫等
2020/11/05 全球购物
会计职业生涯规划书
2014/01/13 职场文书
村长党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
求职信范文怎么写
2015/03/19 职场文书
老生常谈 使用 CSS 实现三角形的技巧(多种方法)
2021/04/13 HTML / CSS
深度学习详解之初试机器学习
2021/04/14 Python
python使用XPath解析数据爬取起点小说网数据
2021/04/22 Python
教你使用TensorFlow2识别验证码
2021/06/11 Python
Spring Cloud 中@FeignClient注解中的contextId属性详解
2021/09/25 Java/Android
常用的文件对应的MIME类型汇总
2022/04/26 HTML / CSS