2014-11-08 133 views
0

我有問題在PHP中將字符串轉換爲小寫,當它包含一個特殊的字符,在這種情況下,尤其是元音變形,因爲我正在處理名稱。這裏的用例是我正在搜索數組中的名字,其中數據庫中所有已存在的名字都被放在小寫字母中(實際上由strtolower完成,它工作正常)。PHP strtolower與特殊的字符(如:

問題是,轉換爲小寫的特殊字符失敗,這很奇怪,因爲它與數據庫中的名稱一起工作,並且在這兩種情況下輸入都是utf8。我甚至用mb_detect_encoding($name)首先檢查編碼,它返回UTF-8

// All names from the database are read into an array, mysql charset is utf8 
    foreach($db_names as $namerow) { 
     $name = $namerow['lastname'] .' '. $namerow['firstname']; 
     $allnames[strtolower($name)] = $namerow['id']; // works 
    } 

    // Get data from a webservice which return utf-8 encoded data (i checked that) 
    $data = ...; 

    // Test the utf-8 
    header('Content-Type: text/html; charset=utf-8'); 
    print_r($allnames); // everything is correct here 
    var_dump(strtolower($data['name'])); // Output i.e. rÖmer - notice still uppercase char 
    var_dump(mb_strtolower($data['name'])); // Output with strange ? character - r?mer 
    var_dump(mb_detect_encoding($data['name'])); // Output: UTF-8 

回答

0

呼叫mb_internal_encoding第一個告訴你想要他們經營什麼編碼的多字節功能:直接

mb_internal_encoding('UTF-8'); 
var_dump(mb_strtolower($data['name'])); 

或者通過編碼參數mb_strtolower

var_dump(mb_strtolower($data['name'], 'UTF-8')); 
+0

花了一段時間找時間嘗試,但你的答案是完美的。它使用php的iconv.internal_encoding設置嗎?也很奇怪的是,strtolower可以使用utf8從數據庫,但不是從外部API ... – patman 2014-11-14 16:52:47

+0

它使用'mbstring.internal_encoding' ini設置。 – Boann 2014-11-14 16:59:24