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防注入安全代码
Apr 09 PHP
PHP程序员最常犯的11个MySQL错误小结
Nov 20 PHP
javascript,php获取函数参数对象的代码
Feb 03 PHP
PHP笔记之:日期函数的使用介绍
Apr 24 PHP
解析thinkphp import 文件内容变量失效的问题
Jun 20 PHP
PHP防止post重复提交数据的简单例子
Jun 07 PHP
PHP设计模式之观察者模式实例
Feb 22 PHP
PHP单链表的实现代码
Jul 05 PHP
PHP 输出缓冲控制(Output Control)详解
Aug 25 PHP
php获取目录中所有文件名及判断文件与目录的简单方法
Mar 04 PHP
php如何修改SESSION的生存存储时间的实例代码
Jul 05 PHP
php 判断IP为有效IP地址的方法
Jan 28 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执行速度全攻略(上)
2006/10/09 PHP
php在服务器执行exec命令失败的解决方法
2012/03/03 PHP
PHP连接MSSQL时nvarchar字段长度被截断为255的解决方法
2014/12/25 PHP
PHP mysqli事务操作常用方法分析
2017/07/22 PHP
在 PHP 和 Laravel 中使用 Traits的方法
2019/11/13 PHP
pjblog修改技巧汇总
2007/03/12 Javascript
js TextArea的选中区域处理
2010/12/28 Javascript
Jquery 自定义动画概述及示例
2013/03/29 Javascript
jQuery 网易相册鼠标移动显示隐藏效果实现代码
2013/03/31 Javascript
jquery实现的可隐藏重现的靠边悬浮层实例代码
2013/05/27 Javascript
javascript中的取反再取反~~没有意义
2014/04/06 Javascript
Js+Jq获取URL参数的集中方法示例代码
2014/05/20 Javascript
jQuery找出网页上最高元素的方法
2015/03/20 Javascript
javascript学习笔记_浅谈基础语法,类型,变量
2016/09/19 Javascript
ES6新特性一: let和const命令详解
2017/04/20 Javascript
浅谈JS中的常用选择器及属性、方法的调用
2017/07/28 Javascript
Angularjs单选框相关的示例代码
2017/08/17 Javascript
react.js 父子组件数据绑定实时通讯的示例代码
2017/09/25 Javascript
vue2.0模拟锚点的实例
2018/03/14 Javascript
jQuery实现的简单获取索引功能示例
2018/06/04 jQuery
详解Node.js读写中文内容文件操作
2018/10/10 Javascript
前端路由&amp;webpack基础配置详解
2019/06/10 Javascript
用Golang运行JavaScript的实现示例
2019/11/25 Javascript
vue 组件简介
2020/07/31 Javascript
Python多线程爬虫实战_爬取糗事百科段子的实例
2017/12/15 Python
Python使用Pickle库实现读写序列操作示例
2018/06/15 Python
Python过滤txt文件内重复内容的方法
2018/10/21 Python
ubuntu 18.04 安装opencv3.4.5的教程(图解)
2019/11/04 Python
Python 中判断列表是否为空的方法
2019/11/24 Python
pytorch实现mnist分类的示例讲解
2020/01/10 Python
社会实践心得体会
2014/01/03 职场文书
高等教育学自荐书范文
2014/02/10 职场文书
应用心理学专业求职信
2014/08/04 职场文书
优秀家长自荐材料
2014/08/26 职场文书
Python办公自动化PPT批量转换操作
2021/09/15 Python
Go中使用gjson来操作JSON数据的实现
2022/08/14 Golang