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 a simple smtp class
Nov 26 PHP
PHP读取目录下所有文件的代码
Jan 07 PHP
不重新编译PHP为php增加openssl模块的方法
Jun 14 PHP
PHP flock 文件锁详细介绍
Dec 29 PHP
基于php权限分配的实现代码
Apr 28 PHP
smarty简单入门实例
Nov 28 PHP
PHP经典面试题之设计模式(经常遇到)
Oct 15 PHP
windows平台中配置nginx+php环境
Dec 06 PHP
php导出生成word的方法
Dec 25 PHP
老生常谈PHP面向对象之解释器模式
May 17 PHP
PHP闭包定义与使用简单示例
Apr 13 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和ACCESS写聊天室(三)
2006/10/09 PHP
用PHP获取Google AJAX Search API 数据的代码
2010/03/12 PHP
php快速url重写更新版[需php 5.30以上]
2010/04/25 PHP
php代码运行时间查看类代码分享
2011/08/06 PHP
编写PHP脚本来实现WordPress中评论分页的功能
2015/12/10 PHP
javascript 兼容鼠标滚轮事件
2009/04/07 Javascript
理解Javascript_10_对象模型
2010/10/16 Javascript
JavaScript实现从数组中选出和等于固定值的n个数
2014/09/03 Javascript
jquery中one()方法的用法实例
2015/01/16 Javascript
微信小程序 input输入框控件详解及实例(多种示例)
2016/12/14 Javascript
jquery请求servlet实现ajax异步请求的示例
2017/06/03 jQuery
js + css实现标签内容切换功能(实例讲解)
2017/10/09 Javascript
layer弹出的iframe层在执行完毕后关闭当前弹出层的方法
2018/08/17 Javascript
对angular 监控数据模型变化的事件方法$watch详解
2018/10/09 Javascript
vue滚动tab跟随切换效果
2020/06/29 Javascript
layui表单提交到后台自动封装到实体类的方法
2019/09/12 Javascript
Python实现建立SSH连接的方法
2015/06/03 Python
Python如何获取系统iops示例代码
2016/09/06 Python
pandas数据预处理之dataframe的groupby操作方法
2018/04/13 Python
pandas 两列时间相减换算为秒的方法
2018/04/20 Python
Flask框架各种常见装饰器示例
2018/07/17 Python
详解Python list和numpy array的存储和读取方法
2019/11/06 Python
详解Python中打乱列表顺序random.shuffle()的使用方法
2019/11/11 Python
html5教你做炫酷的碎片式图片切换 (canvas)
2017/07/28 HTML / CSS
世界上最悠久的自行车制造商:Ribble Cycles
2017/03/18 全球购物
简述索引存取方法的作用和建立索引的原则
2013/03/26 面试题
幼儿教师培训感言
2014/03/08 职场文书
初中生操行评语大全
2014/04/24 职场文书
陈胜吴广起义口号
2014/06/20 职场文书
2014年人事科工作总结
2014/11/19 职场文书
餐饮服务员岗位职责
2015/02/09 职场文书
慈善献爱心倡议书
2015/04/27 职场文书
平凡的世界读书笔记
2015/06/25 职场文书
业务员管理制度范本
2015/08/06 职场文书
Python实现Hash算法
2022/03/18 Python
带你了解Java中的ForkJoin
2022/04/28 Java/Android