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如何透过ODBC来存取数据库
Oct 09 PHP
PHP 超链接 抓取实现代码
Jun 29 PHP
php 广告调用类代码(支持Flash调用)
Aug 11 PHP
在PHP中设置、使用、删除Cookie的解决方法
May 06 PHP
利用php+mcDropdown实现文件路径可在下拉框选择
Aug 07 PHP
完美实现wordpress禁止文章修订和自动保存的方法
Nov 03 PHP
php+jQuery+Ajax实现点赞效果的方法(附源码下载)
Jul 21 PHP
php文档工具PHP Documentor安装与使用方法
Jan 25 PHP
深入理解PHP原理之执行周期分析
Jun 01 PHP
PHP反射API示例分享
Oct 08 PHP
php+mysql+jquery实现简易的检索自动补全提示功能
Apr 15 PHP
PHP环形链表实现方法示例
Sep 15 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数组合并array_merge()函数使用注意事项
2014/06/19 PHP
PHP模拟asp.net的StringBuilder类实现方法
2015/08/08 PHP
php二维码生成以及下载实现
2017/09/28 PHP
分析php://output和php://stdout的区别
2018/05/06 PHP
PHP Web表单生成器案例分析
2020/06/02 PHP
AJAX异步从优酷专辑中采集所有视频及信息(JavaScript代码)
2010/11/20 Javascript
js在指定位置增加节点函数insertBefore()用法实例
2015/01/12 Javascript
7个让JavaScript变得更好的注意事项
2015/01/28 Javascript
jquery 插件实现多行文本框[textarea]自动高度
2015/03/04 Javascript
JavaScript中的splice()方法使用详解
2015/06/09 Javascript
javascript生成img标签的3种实现方法(对象、方法、html)
2015/12/25 Javascript
自动完成的搜索框javascript实现
2016/02/26 Javascript
浅谈JavaScript函数的四种存在形态
2016/06/08 Javascript
JS HTML5实现拖拽移动列表效果
2020/08/27 Javascript
jQuery实现页面点击后退弹出提示框的方法
2016/08/24 Javascript
BootStrap daterangepicker 双日历控件
2017/06/02 Javascript
react.js 父子组件数据绑定实时通讯的示例代码
2017/09/25 Javascript
Javascript将图片的绝对路径转换为base64编码的方法
2018/01/11 Javascript
JavaScript同源策略和跨域访问实例详解
2018/04/03 Javascript
Vue表单控件绑定图文详解
2019/02/11 Javascript
jquery无缝图片轮播组件封装
2020/11/25 jQuery
layui清空,重置表单数据的实例
2019/09/12 Javascript
vue实现随机验证码功能(完整代码)
2019/12/10 Javascript
在Python中使用swapCase()方法转换大小写的教程
2015/05/20 Python
Python抓取手机号归属地信息示例代码
2016/11/28 Python
Python实现将SQLite中的数据直接输出为CVS的方法示例
2017/07/13 Python
浅谈机器学习需要的了解的十大算法
2017/12/15 Python
python用pip install时安装失败的一系列问题及解决方法
2020/02/24 Python
python中resample函数实现重采样和降采样代码
2020/02/25 Python
Python大批量搜索引擎图像爬虫工具详解
2020/11/16 Python
CSS3的column-fill属性对齐列内容高度的用法详解
2016/07/01 HTML / CSS
英国领先的运动营养品牌:Protein Dynamix
2018/01/02 全球购物
美国最大最全的亚洲购物网站:美国亚米网(Yamibuy)
2020/05/05 全球购物
青年文明号事迹材料
2014/01/18 职场文书
竞选班长演讲稿500字
2014/08/22 职场文书
2015年科学教研组工作总结
2015/07/22 职场文书