2011-10-02 75 views
3

我已经浏览了整个网络,只是想方设法使搜索对变音符号不敏感,但我需要相反的方式。进行变音符号敏感搜索

在我的情况下,我需要能够比较具体的符号与上标和下标点(即ȧ&ạ)和一些其他更常见的绅士(á,ã等),但这些字母可能是任何东西(ṡ, ṛ,ṫ,ḍ,ṅ等)。想要的结果是这样的:如果我搜索“a”,我只收到“a”,如果我搜索“ȧ”,我只收到“ȧ”,而不是“a”点)。

我读过,我需要使用utf8_bin并试图改变我的字段排序规则,表排序规则和数据库排序规则,但没有成功。代码如下:

// "sound" is being passed in by an AJAX call 
$sound = $_POST['sound']; 

$query = "SELECT * FROM sounds WHERE 'sound' = '$sound'"; 
$result = mysql_query($query); 

// This is then sent back to my page. 

我也看过COLLATE,但成功率很低。当我使用utf8_general_ci或utf8_unicode_ci我得到的“一”或“埃”返回两个“埃”和“a”的例外结果

// Attempting to covert the searched string into the utf8_bin format to match my db collations 
$query = "SELECT * FROM sounds WHERE 'sound' = '$sound' COLLATE utf8_bin"; 

:我可能误解了探测器的使用。但是,如果我使用utf8_bin,那么在搜索其中任何一个时都不会得到任何结果。我相信这是因为在我的数据库中,当使用utf8_bin时,“ - (PH)”(我的一个条目)被转换为 - “e1b98528504829”。那么在查询它们之前,有没有办法将我的搜索转换为相同的格式?或者只是一个更好的方式来完成这项工作?

谢谢!

+1

您的传入数据是UTF-8编码的吗? –

+0

是的,如果你的意思是页面的meta“Content-Type”被设置为UTF8。 – Henry

+0

@Pekka - 由于搜索适用于utf8_general_ci和utf8_unicode_ci,所以这不太可能是编码问题。 –

回答

0

好的,从朋友那里得到一些帮助,我得到了它的工作。原来,utf8_general_ci排序规则也可以。

我的第一个问题是我如何将数据输入到数据库中。我曾经使用phpMyAdmin来做到这一点,由于某些原因,没有正确编码数据,我所有的垃圾箱都出错了。这是通过编写我自己的sql来输入值来解决的。

其次,我结束了使用PHP函数iconv()来编码来自网页的数据。这两个解决方案放在一起得到了匹配的值,整个脚本运行良好。

谢谢大家的帮助和建议...真的很感激,相信我,没有去浪费。我花了很长时间摆弄他们。

干杯!

2

我的猜测是你的数据没有被标准化。为了使用utf8_bin整理序列,您需要使用规范化的数据。数据库中的数据和查询中的数据都需要进行标准化。

字节序列e1 b9 85是拉丁文小写字母N(U + 1E45)的UTF-8编码,但可以分解为拉丁文小写字母N(U + 006E)+合并点数(U + 0307)。分解的UTF-8编码将是6e cc 87。 utf8_general_ci和utf8_unicode_ci排序顺序会自动处理,但utf8_bin不会。

单独注释 - 您不应该通过直接插入$sound来构建查询。这会使系统容易受到SQL injection attacks的攻击,从而在系统中造成巨大的安全漏洞。相反,请使用准备好的语句和参数绑定。 (这个php文件有an example of how to do this。)

+0

当你说“正常化”时,你的意思是使用PHP函数吗?:http://php.net/manual/en/normalizer.normalize.php此外,这个函数需要PHP 5.3,但我的主机不会让我更新。是否有一种使用早期版本的PHP规范化数据的方法? – Henry

+0

@亨利 - 这正是你需要的功能。我不知道在早期版本的PHP上运行的任何php实现。你可能会问你的主机是否会为你升级php,因为它们不允许你自己做。另外,一个解决方法可能是在你的服务器上安装一个脚本,让php在后台调用它。 W3C有一个[Perl规范化脚本](http://www.w3.org/International/charlint/),可能对此有用。 –

相关问题