【发布时间】:2012-01-04 05:20:06
【问题描述】:
我对此进行了大量研究和测试。
据我了解,HTTP 标头仅在 Web 服务器设置为这样做时才设置,并且即使开发人员不打算这样做,也可能默认为特定编码。仅当开发人员决定在他们的代码中这样做时才会设置元标头...这也可能由某些开发框架自动设置(如果开发人员没有考虑这一点,这是有问题的)。
我发现,如果设置了这些,它们通常会相互冲突。例如。 HTTP 标头表示页面为iso-8859-1,而元标记指定windows-1252。我可以假设一个取代另一个(可能是元标记),但这似乎相当不可靠。似乎很少有开发人员在处理他们的数据时考虑到这一点,因此动态生成的网站通常会混合编码或使用他们不打算通过来自其数据库的不同编码的编码。
我的结论是做到以下几点:
- 使用
mb_detect_encoding()检查每个页面的编码。 - 如果失败,我使用元编码 (
http-equiv="Content-Type"...)。 - 如果没有元内容类型,我使用 HTTP 标头 (
content_type)。 - 如果没有 http 内容类型,我假设 UTF-8。
- 最后,我使用 mb_convert_encoding() 转换文档。然后我抓取它的内容。 (我特意省略了要转换的编码,以避免在这里讨论。)
我正在尝试获取尽可能准确的内容,而不是因为开发人员没有正确设置标题而忽略网页。
您认为这种方法有什么问题?
我会在使用 mb_detect_encoding() 和 mb_convert_encoding() 方法时遇到问题吗?
【问题讨论】:
-
UTF-8 端到端或死亡。
标签: php html character-encoding web-scraping