我应该如何处理字符编码时存储爬行的网页内容为搜索引擎到MySQL数据库


How should I deal with character encodings when storing crawled web content for a search engine into a MySQL database?

我有一个爬虫下载网页,刮特定的内容,然后将内容存储到MySQL数据库。之后,该内容在搜索时显示在网页上(标准搜索引擎类型设置)。

内容一般有两种不同的编码类型…UTF-8ISO-8859-1或不指定。我的数据库表使用cp1252 west european ( latin1 )编码。到目前为止,在将内容存储到MySQL之前,我只是使用正则表达式过滤了所有非字母数字、空格或标点符号的字符。在大多数情况下,这消除了所有字符编码问题,并且在调用和输出到HTML时可以正确显示内容。下面是我使用的代码:

function clean_string( $string )
{
    $string = trim( $string );
    $string = preg_replace( '/[^a-zA-Z0-9's'p{P}]/', '', $string );
    $string = $mysqli->real_escape_string( $string );
    return $string;
}

我现在需要开始捕捉"特殊"字符,如商标,版权和注册符号,我有麻烦。无论我如何尝试,当我在HTML中重新显示内容时,我最终都会得到奇怪的字符。

从我所读到的,这听起来像我应该使用UTF-8为我的数据库编码。如何确保所有数据在存储到数据库之前都被正确转换?请记住,我的原始内容来自各种编码格式的网络。我是否忽略了其他可能给我带来问题的步骤?

您应该将您的数据库编码转换为UTF-8。

关于内容:对于您抓取的每个页面,获取页面的编码(从HTTP header/)元字符集)并使用该编码转换为utf-8,如下所示:

$string = iconv("UTF-8", "THIS STRING'S ENCODING", $string);

这里的THIS STRING'S ENCODING就是你刚才抓的那个。

PHP manual on iconv: http://be2.php.net/manual/en/function.iconv.php

UTF-8几乎涵盖了所有内容。这是我的选择。

就存储数据而言,只需确保到数据库的连接使用正确的字符集。

要处理ISO编码,只需在存储时使用utf8_encode,在检索时使用utf8_decode

尝试做编码/解码,即使它被认为是UTF-8,看看这是否适合你。我经常看到人们说一些东西是UTF-8,但实际上不是。

您还需要将数据库更改为UTF-8

当我在html页面上抓取和呈现数据时,下面的内容对我很有用。

  1. 当从外部网站抓取数据时,执行utf8_encode: utf8_encode(trim(str_replace(array("'t","'n'r","'n","'r"),"",trim($th->plaintext))));
  2. 在写入HTML页面之前,将字符集设置为utf-8: <meta charset="UTF-8">
  3. 当在html上写回显时,执行utf8_decode。echo "Menu Item:". utf8_decode ($value['item'])

这帮助我解决了我的html抓取问题。