我有一个爬虫下载网页,刮特定的内容,然后将内容存储到MySQL数据库。之后,该内容在搜索时显示在网页上(标准搜索引擎类型设置)。
内容一般有两种不同的编码类型…UTF-8
或ISO-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页面上抓取和呈现数据时,下面的内容对我很有用。
- 当从外部网站抓取数据时,执行utf8_encode:
utf8_encode(trim(str_replace(array("'t","'n'r","'n","'r"),"",trim($th->plaintext))));
- 在写入HTML页面之前,将字符集设置为utf-8:
<meta charset="UTF-8">
- 当在html上写回显时,执行utf8_decode。
echo "Menu Item:". utf8_decode ($value['item'])
这帮助我解决了我的html抓取问题。