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 相关文章推荐
如何在WIN2K下安装PHP4.04
Oct 09 PHP
js下函数般调用正则的方法附代码
Jun 22 PHP
php函数array_merge用法一例(合并同类数组)
Feb 03 PHP
php修改NetBeans默认字体的大小
Jul 02 PHP
PHP Cookei记录用户历史浏览信息的代码
Feb 03 PHP
详解php中空字符串和0之间的关系
Oct 23 PHP
iOS自定义提示弹出框实现类似UIAlertView的效果
Nov 16 PHP
php面向对象的用户登录身份验证
Jun 08 PHP
彻底搞懂PHP 变量结构体
Oct 11 PHP
PHP实现数组转JSon和JSon转数组的方法示例
Jun 14 PHP
php+mysql开发的最简单在线题库(在线做题系统)完整案例
Mar 30 PHP
Laravel框架基础语法与知识点整理【模板变量、输出、include引入子视图等】
Dec 03 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 小心urldecode引发的SQL注入漏洞
2011/10/27 PHP
PHP使用SOAP调用.net的WebService数据
2013/11/12 PHP
php事务处理实例详解
2014/07/11 PHP
PHP登录验证码的实现与使用方法
2016/07/07 PHP
微信接口生成带参数的二维码
2017/07/31 PHP
javascript中的location用法简单介绍
2007/03/07 Javascript
javascript iframe内的函数调用实现方法
2009/07/19 Javascript
Javascript Cookie读写删除操作的函数
2010/03/02 Javascript
jquery 年会抽奖程序
2011/12/22 Javascript
js禁止document element对象选中文本实现代码
2013/03/21 Javascript
javascript检测浏览器的缩放状态实现代码
2014/09/28 Javascript
JavaScript实现当网页加载完成后执行指定函数的方法
2015/03/21 Javascript
javascript倒计时效果实现
2015/11/12 Javascript
JS表格组件神器bootstrap table详解(基础版)
2015/12/08 Javascript
Bootstrap 最常用的JS插件系列总结(图片轮播、标签切换等)
2016/07/14 Javascript
jQuery插件HighCharts绘制2D柱状图、折线图和饼图的组合图效果示例【附demo源码下载】
2017/03/09 Javascript
微信小程序 在线支付功能的实现
2017/03/14 Javascript
Vue2.0父子组件传递函数的教程详解
2017/10/16 Javascript
JavaScript判断变量名是否存在数组中的实例
2017/12/28 Javascript
基于vue 动态加载图片src的解决方法
2018/02/05 Javascript
vue-cli系列之vue-cli-service整体架构浅析
2019/01/14 Javascript
jQuery三组基本动画与自定义动画操作实例总结
2020/05/09 jQuery
[01:07:11]Secret vs Newbee 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
python读取Android permission文件
2013/11/01 Python
教大家使用Python SqlAlchemy
2016/02/12 Python
解决Pycharm下面出现No R interpreter defined的问题
2018/10/29 Python
Python图像处理之gif动态图的解析与合成操作详解
2018/12/30 Python
基于PyQt4和PySide实现输入对话框效果
2019/02/27 Python
Python基本数据结构之字典类型dict用法分析
2019/06/08 Python
python中pip的使用和修改下载源的方法
2019/07/08 Python
python科学计算之narray对象用法
2019/11/25 Python
Vans奥地利官方网站:美国原创极限运动潮牌
2018/09/30 全球购物
英国珠宝网站Argento: PANDORA、Olivia Burton和Nomination等
2020/05/08 全球购物
CSS代码检查工具stylelint的使用方法详解
2021/03/27 HTML / CSS
应届生文秘专业个人自荐信格式
2013/09/21 职场文书
2016年9月份红领巾广播稿
2015/12/21 职场文书