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 相关文章推荐
fleaphp常用方法分页之Pager使用方法
Apr 23 PHP
php 文本文件的读取效率
Feb 10 PHP
php 操作调试的方法
Jul 12 PHP
PHP mail()函数使用及配置方法
Jan 14 PHP
PHP 面向对象程序设计(oop)学习笔记 (四) - 异常处理类Exception
Jun 12 PHP
php对包含html标签的字符串进行截取的函数分享
Jun 19 PHP
php CI框架插入一条或多条sql记录示例
Jul 29 PHP
php禁止直接从浏览器输入地址访问.php文件的方法
Nov 04 PHP
windows server 2008/2012安装php iis7 mysql环境搭建教程
Jun 30 PHP
thinkphp实现分页显示功能
Dec 03 PHP
php 中self,this的区别和操作方法实例分析
Nov 04 PHP
PHP的imageTtfText()函数深入详解
Mar 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检测文件编码的方法示例
2014/04/25 PHP
php实现的双向队列类实例
2014/09/24 PHP
PHP SFTP实现上传下载功能
2017/07/26 PHP
PHP如何使用JWT做Api接口身份认证的实现
2020/02/03 PHP
PHP pthreads v3下同步处理synchronized用法示例
2020/02/21 PHP
JS 统计时间
2021/03/09 Javascript
在jQuery中 常用的选择器介绍
2013/04/16 Javascript
使用jQuery的attr方法来修改onclick值
2014/07/07 Javascript
jQuery实现的在线答题功能
2015/04/12 Javascript
使用AngularJS中的SCE来防止XSS攻击的方法
2015/06/18 Javascript
JavaScript计算某一天是星期几的方法
2015/08/05 Javascript
跟我学习javascript的undefined与null
2015/11/17 Javascript
Bootstrap安装环境配置教程分享
2016/05/27 Javascript
jQuery中 $ 符号的冲突问题及解决方案
2016/11/04 Javascript
JS定时器用法分析【时钟与菜单中的应用】
2016/12/21 Javascript
Bootstrap 手风琴菜单的实现代码
2017/01/20 Javascript
JS实现数组简单去重及数组根据对象中的元素去重操作示例
2018/01/05 Javascript
在vue2.0中引用element-ui组件库的方法
2018/06/21 Javascript
解决VUE中document.body.scrollTop为0的问题
2018/09/15 Javascript
vue使用echarts图表的详细方法
2018/10/22 Javascript
浅谈Vue的响应式原理
2019/05/30 Javascript
微信小程序通过一个json实现分享朋友圈图片
2019/09/03 Javascript
详解Node.js使用token进行认证的简单示例
2020/05/25 Javascript
js实现电灯开关效果
2021/01/19 Javascript
python批量修改文件后缀示例代码分享
2013/12/24 Python
Flask框架web开发之零基础入门
2018/12/10 Python
局域网内python socket实现windows与linux间的消息传送
2019/04/19 Python
简单分析python的类变量、实例变量
2019/08/23 Python
python requests模拟登陆github的实现方法
2019/12/26 Python
详解HTML5中表单验证的8种方法介绍
2016/12/19 HTML / CSS
canvas小画板之平滑曲线的实现
2020/08/12 HTML / CSS
澳大利亚领先的睡衣品牌:Peter Alexander
2016/08/16 全球购物
德国购买踏板车网站:Microscooter
2019/10/14 全球购物
娇韵诗俄罗斯官方网站:Clarins俄罗斯
2020/10/03 全球购物
党员个人对照检查材料范文
2014/09/24 职场文书
Spring Boot 使用 Spring-Retry 进行重试框架
2022/04/24 Java/Android