php+html+转码,PHP解析html类库simple_html_dom的转码bug

news/2024/5/19 18:55:12

这几天有在用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日在鏈濋槼公园马术场举行的2014浪琴国际马联场地障碍世界杯中国联赛资格赛上,24岁的韩壮壮不仅拿到零罚分的成绩 ...第7个出场的鍖椾含奥运骑手赵志文第一个收获零罚分,用时77秒07 ...

既成的事实了,证明里头的转码功能没有处理好。由于我使用这个simple_html_dom只是想要用来构建dom。我并没有打算花时间去很好地处理这个bug。而是简单地把

$converted_text = iconv($sourceCharset, $targetCharset, $text);

改成

$converted_text = $text;

就行了。思路就是取消它的转码。好吧工作不必纠结,可以继续了。


http://www.niftyadmin.cn/n/3089497.html

相关文章

个人常用的linux/unix命令

私人mac配置环境变量文件位置:个人用户下: vim /etc/profile 建议环境变量文件位置: touch ~/.bash_profile 复制代码删除文件rm [options] [fileName] -r : 递归删除子目录 -f : 禁用确认 -i : 删除前逐一询问确认 -v : 显示删除细节 复制代码移动文件夹…

不畏将来

自己的人生道路,除了自己,没有任何人可以为之负责。去相信所有遇到的人都是人生中注定要遇到的人,遇到喜欢的人,就认真的爱吧,遇到不喜欢的人,也认真的对待,不辜负这番注定的缘分。人生中所有经…

第三讲 多重背包问题(对背包九讲的学习)

题目 有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。 基本思路: 对每个物品都考虑拿几个(这个很好理解) 递推式:f[i][…

分页插件php,PHP框架Laravel插件Pagination实现自定义分页

Laravel 的分页很方便,其实扩展起来也挺容易的,下面就来做个示例,扩展一下 paginate() 和 simplePaginate() 方法,来实现我们自定义分页样式,比如显示 "上一页" 和 "下一页" ,而不是 &…

项目Alpha冲刺 Day9

1)站立式会议: 2)今日安排: 计划完成活动开始与活动结束两个模块(苏华、赵晓南),具体活动详情页面(范媛媛)以及今日完成对应模块的相关测试(陶涛)…

java保护访问,Java中受保护的访问修饰符

小编典典该网页链接MadProgrammer给出了一个体面的解释:“ protected修饰符指定只能在自己的包中访问该成员(与package-private一样),并且只能由其在另一个包中的类的子类访问。”这意味着受保护的成员必须直接通过其定义的类或该类的子类进行访问&#…

如何做好一个Team leader(转)

1.领导和管理 人们乐于被领导;他们不喜欢被管理,不喜欢像牛一样被驱赶或指挥。 管理者强迫人们服从他们的命令,而领导者则会带领他们一起工作。 管理是客观的,没有个人感情因素,它假定被管理者没有思想和感受…

Java 接口和抽象类是什么,有什么区别

抽象(abstract)和接口(interface)在Java中都是关键字,也就说明他们足够重要,而抽象类和接口为我们面向对象编程提供了非常大的帮助。下面我们就一起来回顾这基础知识。 抽象类 在构建某些未实现方法的类时,你可能会第一个想到接口&#xff0c…