2011-09-23 106 views
4

所以,我要建一個使用一個已經建立,並已在相當一段由客戶使用他們所有的其他網站數據庫飼料網站時間。轉換ASCII和UTF-8非特殊字符與一個功能

他們填補了這一數據庫,通過一個外部程序,我也沒有辦法改變我讓我的數據的方式。

現在我有以下問題,有時我得到的字符串在UTF-8,有時在ASCII(我希望我有這些條款的權利,他們仍然有點模糊我有時會)。

所以我能得到這兩種:ScénicScénic

現在的問題是,我不得不將其轉換爲無特殊字符(所以它會成爲Scenic)對於網址。

我不認爲有轉換ée功能(如果有的話一定要告訴),所以我可能會需要創建,包含所有的源和目的地的數組,但更大的問題是轉換éé而不會破壞é當它通過該功能。

或者我應該創建一個包含一切的數組
(因此,例如:array('é'=>'e','é'=>'e');

我知道怎麼去éé,通過做utf8_encode(html_entity_decode('é')),但是把é通過這個相同的函數將返回é

也許我處理這個錯誤的方式,但在這種情況下,我很想知道我應該方法吧。

+2

html_entity_decode( 「éé」,ENT_COMPAT, 「UTF-8」)工作正常,我 - 它輸出 「EE」。 Maby你忘了設置編碼?這應該在UTF-8和第一個128位ASCII碼(純文本)上工作,因爲它們在UTF-8中具有相同的值 - 看起來正是你的情況。 – XzKto

+0

嗯,解決了一半的問題:) – Kokos

+0

iconv(「UTF-8」,「ASCII // TRANSLIT」,「ééé」)解決第二部分問題嗎? – XzKto

回答

11

感謝@XzKto和PHP.net this評論我改變了我的蛞蝓功能如下:

static function slug($input){ 

    $string = html_entity_decode($input,ENT_COMPAT,"UTF-8"); 

    $oldLocale = setlocale(LC_CTYPE, '0'); 

    setlocale(LC_CTYPE, 'en_US.UTF-8'); 
    $string = iconv("UTF-8","ASCII//TRANSLIT",$string); 

    setlocale(LC_CTYPE, $oldLocale); 

    return strtolower(preg_replace('/[^a-zA-Z0-9]+/','-',$string)); 

} 

我覺得像setlocale部分是有點髒,但是這完全適用於翻譯的特殊字符自己'正常'等值。

輸入a áñö ïß éèé返回a-ano-iss-eee

+1

之後您應該重置區域設置。 – Alex

+0

更新!感謝提示:) – Kokos

+4

它應該是'$ oldLocal = setlocale(LC_CTYPE,'0');' 只有一個參數的情況下使用'setlocale'會導致錯誤。 如果你想得到當前的語言環境,你應該使用一個字符串'0'作爲第二個參數。 http://php.net/manual/en/function.setlocale.php –