2011-10-02 98 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/),可能對此有用。 –