Php 在对web进行爬网时,如何将web内容转换为一致的字符集?

Php 在对web进行爬网时,如何将web内容转换为一致的字符集?,php,html,character-encoding,web-scraping,Php,Html,Character Encoding,Web Scraping,我对此做了很多研究和测试 据我所知,HTTP头只有在web服务器设置为这样做时才会设置,并且可能默认为特定的编码,即使开发人员并不打算这样做。只有在开发人员决定在其代码中设置元头时,才会设置元头。。。这也可以由一些开发框架自动设置(如果开发人员没有考虑这个问题,这是有问题的)。 我发现,如果这些都设置好了,它们往往会相互冲突。HTTP标题表示页面为iso-8859-1,而meta标记指定windows-1252。我可以假设其中一个取代了另一个(可能是meta标记),但这似乎相当不可靠。在处理数据

我对此做了很多研究和测试

据我所知,HTTP头只有在web服务器设置为这样做时才会设置,并且可能默认为特定的编码,即使开发人员并不打算这样做。只有在开发人员决定在其代码中设置元头时,才会设置元头。。。这也可以由一些开发框架自动设置(如果开发人员没有考虑这个问题,这是有问题的)。 我发现,如果这些都设置好了,它们往往会相互冲突。HTTP标题表示页面为
iso-8859-1
,而meta标记指定
windows-1252
。我可以假设其中一个取代了另一个(可能是meta标记),但这似乎相当不可靠。在处理数据时,似乎很少有开发者考虑到这一点,所以动态生成的站点经常混合编码或使用它们不打算通过来自数据库的不同编码来编码。

我的结论如下:

  • 使用
    mb\u detect\u encoding()
    检查每页的编码
  • 如果失败,我将使用元编码(
    http equiv=“Content Type”…
  • 如果没有元内容类型,则使用HTTP头(
    content\u type
  • 如果没有http内容类型,我假设为UTF-8
  • 最后,我使用mb_convert_encoding()转换文档。然后,我把它刮得很满。(我故意省略了要转换为的编码,以避免在这里进行讨论。)
  • 我试图获得尽可能多的准确内容,而不是因为开发人员没有正确设置标题而忽略网页

    您认为这种方法存在哪些问题?


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

    是的,您会遇到问题
    mb_detect_编码不太可靠,请参见以下示例:

    这将输出
    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/')));
    
    我建议您应用所有可用的方法,并使用外部库(如以下库:),并使用最可能的编码

    另一种更精确的方法是建立一个特定于国家/地区的可能字符集列表,只使用那些采用
    mb\u convert\u编码的字符集。就像在匈牙利一样,ISO-8859-2或UTF-8是最有可能的,其他的都不值得考虑。可以通过TLD、
    内容语言
    HTTP头和IP地址位置的组合来猜测国家。尽管这需要一些研究工作和额外的开发,但可能值得付出努力


    mb\u convert\u encoding
    文档中的一些注释报告说
    iconv
    更适用于日语字符集。

    UTF-8端到端或die。