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学习笔记 面向对象中[接口]与[多态性]的应用
Jun 16 PHP
php数组去重的函数代码
Feb 03 PHP
PHP导航下拉菜单的实现如此简单
Sep 22 PHP
php通过strpos查找字符串出现位置的方法
Mar 17 PHP
php如何获取文件的扩展名
Oct 28 PHP
各种快递查询--Api接口
Apr 26 PHP
php实现学生管理系统
Mar 21 PHP
php验证码生成器
May 24 PHP
Laravel Eloquent分表方法并使用模型关联的实现
Nov 25 PHP
PHP字符串和十六进制如何实现互相转换
Jul 16 PHP
php实现记事本案例
Oct 20 PHP
Thinkphp极验滑动验证码实现步骤解析
Nov 24 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新建文件的方法实例
2019/09/26 PHP
使用JQuery和s3captche实现一个水果名字的验证
2009/08/14 Javascript
js使下拉列表框可编辑不止是选择
2013/12/12 Javascript
Javascript中的delete操作符详细介绍
2014/06/06 Javascript
node.js中的fs.rmdirSync方法使用说明
2014/12/16 Javascript
浅谈javascript 归并方法
2015/01/21 Javascript
JavaScript返回网页中超链接数量的方法
2015/04/03 Javascript
jquery动画效果学习笔记(8种效果)
2015/11/13 Javascript
js, jQuery实现全选、反选功能
2017/03/08 Javascript
关于meta viewport中target-densitydpi属性详解(推荐)
2017/08/18 Javascript
Vue2.0基于vue-cli+webpack父子组件通信(实例讲解)
2017/09/14 Javascript
vue-cli中打包图片路径错误的解决方法
2017/10/26 Javascript
vue复合组件实现注册表单功能
2017/11/06 Javascript
JS Input里添加小图标的两种方法
2017/11/11 Javascript
Vue实现web分页组件详解
2017/11/28 Javascript
react-native封装插件swiper的使用方法
2018/03/20 Javascript
node中modules.exports与exports导出的区别
2018/06/08 Javascript
Python ZipFile模块详解
2013/11/01 Python
Python中的jquery PyQuery库使用小结
2014/05/13 Python
Python实现遍历数据库并获取key的值
2015/05/17 Python
python在每个字符后添加空格的实例
2018/05/07 Python
TensorFlow实现简单的CNN的方法
2019/07/18 Python
中国排名第一的外贸销售网站:LightInTheBox.com(兰亭集势)
2016/10/28 全球购物
瑞典时尚耳机品牌:Urbanears
2017/07/26 全球购物
彪马俄罗斯官网:PUMA俄罗斯
2019/07/13 全球购物
北京泡泡网网络有限公司.net面试题
2012/07/17 面试题
Java中的异常处理机制的简单原理和应用
2013/04/27 面试题
国际商务系学生个人的自我评价
2013/11/26 职场文书
骨干教师培训制度
2014/01/13 职场文书
公司晚会策划方案
2014/05/17 职场文书
信息员培训方案
2014/06/12 职场文书
2015年业务工作总结范文
2015/04/10 职场文书
公司文体活动总结
2015/05/07 职场文书
2015年小学数学教师工作总结
2015/05/20 职场文书
2015年新教师个人工作总结
2015/10/14 职场文书
Go语言实现Snowflake雪花算法
2021/06/08 Golang