2010-08-24 68 views
1

我需要比較字符串和匹配名稱,即使它們拼寫不一樣。 例如DÉSIRÉ-Smith應匹配Desireesmith以及西瑞或Desi'ree Smithiconv utf-8轉換爲mod_php/apache2中的ascii音譯

所以我有以下計算策略,其使用PHP-CLI工作完全在命令行:

<? 
    class Alike { 
     static function convertAlike($string) { 
     // in case the first and last name or two first names are mixed up 
     $parts = preg_split('/[\s\-\.\_]/', $string, -1, PREG_SPLIT_NO_EMPTY); 
     sort($parts); 
     $string = implode($parts); 

     $string = iconv('UTF-8', 'ASCII//TRANSLIT', $string); // transliterate 
     $string = strtolower($string); // lowercase 
     $string = preg_replace('/[^a-z]/','',$string); // remove everything but a-z 
     $string = preg_replace('{(.)\1+}','$1',$string); // remove duplicate chars 
     return $string; 
     } 
     static function compareAlike($string1,$string2) { 
     return (strcmp(Alike::convertAlike($string1),Alike::convertAlike($string2)) === 0) ? true : false; 
     } 
    } 
    echo Alike::convertAlike("DÉSIRÉ-Smith").PHP_EOL; // desiresmith 
    echo Alike::convertAlike("Desireesmith").PHP_EOL; // desiresmith 
    echo Alike::convertAlike("Desi'ree Smith").PHP_EOL; // desiresmith 
    echo Alike::convertAlike("René Röyßeå likes special characters ½ € in ©").PHP_EOL; // reneroysealikespecialcharacterseurinc 

    var_dump(Alike::compareAlike("DÉSIRÉ-Smith","Desireesmith")); // true 
    var_dump(Alike::compareAlike("Desireesmith","Desi'ree Smith")); // true 
    var_dump(Alike::compareAlike("summer","winter")); // false 
    ?> 

但是在我的網站上運行Server version: Apache/2.2.14 (Ubuntu)運行PHP Version 5.3.2-1ubuntu4.2作爲模塊,我總是得到問題跡象。 有趣的是,該錯誤必須在這行occour

$string = iconv('UTF-8', 'ASCII//TRANSLIT', $string); // transliterate 

,因爲後來我可以看到每一個尚未音譯字,但那些應該被替換爲ASCII字符成爲問題的跡象。

我嘗試了輸入/輸出字符串編碼和iconv內部,輸入和輸出編碼設置以及區域設置的每種可能的組合。我甚至做了chmod -R 777/usr/lib/gconv並將其移至我的工作目錄。

但是我看到這個錯誤報道ONT他的郵件列表: http://bugs.php.net/bug.php?id=44096

[2010-06-07 21:22 UTC] icovt at yahoo dot com 
mod_php iconv() is not working properly if your apache is chrooted and you do not 
have the content of /usr/lib/gconv/ folder into your relative chroot path (i.e. 
/your/chroot/path/usr/lib/gconv/). 
You can simply do: 
cp /usr/lib/gconv/* /your/chroot/path/usr/lib/gconv/ 
... and re-try. 

This was a fix for me, hope this could save time for somebody else. 

P.S. Btw, initially iconv() called from command line (using php cli) was OK. 

我想,我的www數據用戶在家在/ var/WWW /我結束了與文件夾/ VAR/www/usr/lib/gconv /以及/ var/www/myproject/usr/lib/gconv/

提示:我有編碼檢測和轉碼功能,以確保正確的編碼通過,爲了清楚起見,因爲它們不是必需的,如果你輸入utf8字符串,一切都應該很好......

有什麼想法?

回答

2

想通了,語言環境wasnt正確設置和我試圖把它失敗,因爲他們區域設置系統上可用的聯機幫助頁的例子實際上命名不同,那麼 簡單locale -a透露,(根據其編碼!);Ø )

setlocale(LC_ALL, "en_US.utf8"); 

這實際上做了工作!

現在好了,這個功能很完美。

現在好了,明白了它爲什麼從控制檯也能工作,因爲語言環境是從當前用戶shell設置導入的;) 它實際上只需要設置任何語言環境。如果我們轉換爲ascii,而不是每個人都相同,只有一些人比其他人更平等:)

小心設置實際安裝在系統中的語言環境並檢查setlocale的結果,因爲您如果語言環境未安裝或名稱拼寫錯誤,則不會更改任何內容。