2009-06-19 42 views
1

我正在編寫一個字符串比較函數來對醫療術語進行排序,這些術語通常包含來自許多不同歐洲語言的特殊重音字符,並且我需要以某種方式實現類似於MySQL的latin1_general_ci的排序規則。如何在PHP中實現類似MySQL的latin1_general_ci排序規則?

首先,我正在對字符串進行一些基本的刪除操作,以刪除空格,引號,連字符,括號等。問題出在我使用默認語言環境將字符串傳遞到strcoll()時,因爲它不夠智能例如,將重音符號e視爲按字典順序等同於正常的e。

我很謹慎使用德語或法語等語言環境,因爲它可能不會包含我需要考慮的所有特殊字符。是否有一個語言環境會給我類似於latin1_general_ci排序規則的內容?或者是否有另一種解決方案?

我的天真的解決方案是創建一個大的關聯數組來映射重音字母到它們的常規字母等價物,然後使用str_replace(),但這聽起來很慢且乏味(並且容易出錯)。如果可能的話,我寧願使用內置的語言。

另外在那個說明中,strcmp()strcasecmp()尊重當前語言環境的排序規則,還是僅僅是strcoll()這樣做?

回答

1

也許這:

setlocale(LC_COLLATE, 'fr_FR.Latin1', 'fr.Latin1', 'fr_FR.Latin-1', 'fr.Latin-1'); 

strcmp()strcasecmp()未本地化。

+0

那是法國人嗎?德語中不會有字符,在這種排序中不會被記錄下來嗎?或者FR做了一些特別的事情? 我確實找到了一個「Indo-European」區域設置,我目前正在測試它是否會生成所需的結果併爲我之後的特殊字符進行帳戶。 – 2009-06-19 01:39:13

+0

這是法語,但我試圖使用.Latin1/.Latin-1修飾符來強制該字符集。真正被接受的是神祕的部分。 – chaos 2009-06-19 01:42:12

0

您還可以嘗試使用iconv函數來幫助標準化字符串。這將處理重讀的e到正常的情況。請參閱有關sorting utf8 strings的相關問題。