当我摘录的文本的最后一个单词有重音(奇怪的字符)时出现问题


issue when my last word of a text excerpt have accents (strange chars)

我正在做一个搜索系统,在这个系统中,我显示了搜索结果,但也显示了以搜索词开头的一些文本。

但是我有一个问题,我不知道如何解决

问题是:当我搜索某个单词时,我的文本的最后一个单词excert的重音很奇怪,或者我有这个"&"或�".

你能帮我理解一下这里出了什么问题吗?

我的问题代码:

$search = $url[1];
$read = $pdo->prepare("SELECT * FROM pages WHERE title LIKE ? OR content LIKE ? LIMIT ?,?"); 
$read->bindValue(1, "%$search%", PDO::PARAM_STR);
$read->bindValue(2, "%$search%", PDO::PARAM_STR);
$read->bindParam(3, $begin,PDO::PARAM_INT);
$read->bindParam(4, $max,PDO::PARAM_INT);
$read->execute();
$searchPos = stripos($result['content'],$search);
$searchLen = strlen($search);
$result_text = '"'.substr($result['content'], $searchPos, $searchLen + 35).'..."';
echo '<p>'.strip_tags($result_text).'</p>';

(我使用tinymce编辑器插入数据库)

要使用tinymce在数据库中插入内容,我是这样做的:

$f['content'] =$_POST['content'];

然后我插入类似:

$insert->bindParam(4,$f['content']);

问题是使用非多字节函数处理多字节UTF-8字符串。

以下是您修改后的代码,可以正常使用UTF-8:

$search = $url[1];
$read = $pdo->prepare("SELECT * FROM pages WHERE title LIKE ? OR content LIKE ? LIMIT ?,?"); 
$read->bindValue(1, "%$search%", PDO::PARAM_STR);
$read->bindValue(2, "%$search%", PDO::PARAM_STR);
$read->bindParam(3, $begin,PDO::PARAM_INT);
$read->bindParam(4, $max,PDO::PARAM_INT);
$read->execute();
$searchPos = mb_stripos($result['content'],$search,0,'utf-8');
$searchLen = mb_strlen($search,'utf-8');
$result_text = '"'.mb_substr($result['content'], $searchPos, $searchLen + 35, 'utf-8').'..."';
echo '<p>'.strip_tags($result_text).'</p>';

mb_*函数用法:

  • http://php.net/manual/en/function.mb-stripos.php
  • http://php.net/manual/en/function.mb-strlen.php
  • http://php.net/manual/en/function.mb-substr.php
  1. 确保您的文件以utf-8(utf-8不带BOM)编码保存,任何高级编辑器都可以选择更改文件编码,notepad++在其主菜单中有此选项
  2. 确保表编码为utf8,例如utf8_general_ci
  3. 在您的dabatase连接字符串中添加charset=utf8,或者如果您使用的是php5.3.6或更早版本,请在查询之前使用"SET NAMES utf8"
  4. 在php标头、html等中设置字符编码
  5. 使用php多字节字符串函数进行字符串搜索、比较等

光电子1、3和5将在很大程度上解决这个问题。

在脚本的最后一行使用htmlentities函数。

echo '<p>'.htmlentities($result_text,ENT_QUOTES,"UTF-8").'</p>';

这应该可以解决"奇怪的字符"问题:p