加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 如何在抓取网页时将网页内容转换为一致的字符集?

发布时间:2020-12-13 22:32:49 所属栏目:PHP教程 来源:网络整理
导读:我已经做了很多关于这个和很多测试的研究. 据我了解,只有在设置Web服务器时才设置HTTP标头,并且即使开发人员不打算这样做,也可能默认为特定编码.只有当开发人员决定在他们的代码中这样做时才会设置元标题…这也可能由某些开发框架自动设置(如果开发人员不考
我已经做了很多关于这个和很多测试的研究.

据我了解,只有在设置Web服务器时才设置HTTP标头,并且即使开发人员不打算这样做,也可能默认为特定编码.只有当开发人员决定在他们的代码中这样做时才会设置元标题…这也可能由某些开发框架自动设置(如果开发人员不考虑这个问题,则会出现问题).

我发现,如果这些设置完全存在,它们往往会相互冲突.例如. HTTP标头表示页面是iso-8859-1,而meta标签指定了windows-1252.我可以假设一个取代另一个(可能是元标记),但这似乎相当不可靠.在处理他们的数据时,似乎很少有开发人员会考虑这一点,因此动态生成的站点通常会混合编码或使用他们不打算通过来自其数据库的不同编码来编码的编码.

我的结论是做了以下事情:

>使用mb_detect_encoding()检查每个页面的编码.
>如果失败,我使用元编码(http-equiv =“Content-Type”…).
>如果没有元内容类型,我使用HTTP标头(content_type).
>如果没有http内容类型,我假设为UTF-8.
>最后,我使用mb_convert_encoding()转换文档.然后我抓了它的内容. (我故意省略了要转换的编码,以避免在此讨论.)

我试图获得尽可能多的准确内容,而不仅仅是忽略网页,因为开发人员没有正确设置标题.

你用这种方法看到了什么问题?

我是否会使用mb_detect_encoding()和mb_convert_encoding()方法遇到问题?

解决方法

是的,你会遇到问题. mb_detect_encoding不太可靠,请看这些例子:

这会输出bool(false),表示检测失败:

var_dump(mb_detect_encoding(file_get_contents('http://www.pazaruvaj.com/')));

另一个输出字符串(5)“UTF-8”,这显然是不正确的结果. HTTP标头和http-equiv在本网站上正确设置,并且它无效UTF-8:

var_dump(mb_detect_encoding(file_get_contents('http://www.arukereso.hu/')));

我建议你应用所有可用的方法,并使用外部库(如下一个:http://mikolajj.republika.pl/)并使用最可能的编码.

另一种使其更精确的方法是建立一个特定国家/地区的可能字符集列表,并仅使用mb_convert_encoding.与匈牙利一样,ISO-8859-2或UTF-8最有可能,其他人则不值得考虑.可以通过TLD,Content-Language HTTP标头和IP地址位置的组合来猜测国家/地区.虽然这需要一些研究工作和额外的开发,但值得努力.

mb_convert_encoding文档中的一些评论报告说iconv对日语字符集更有效.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读