2014-05-13 65 views
6

我有一個字母大寫的所有字母。我正在使用ucwords()和mb_strtolower()函數僅將字符串的第一個字母大寫。但是,當一個單詞的第一個字母有重音時,我遇到了一些問題。例如:ucwords不用大寫重音字母

ucwords(mb_strtolower('GRANDE ÁRVORE')); //outputs 'Grande árvore' 

爲什麼第二個單詞的第一個字母沒有被大寫?我能做些什麼來解決這個問題?

+1

大小寫轉換比您想象的要困難。你用標題模式試過['mb_convert_case()'](http://php.net/manual/en/function.mb-convert-case.php)嗎? – Maerlyn

+0

它適合我:'回聲ucwords(mb_strtolower('GRANDE'RVORE'))''結果'格蘭德Árvore'。嘗試打開顯示的錯誤,並告訴我們是否有任何錯誤出現。 – Chorochrondochor

+0

@Chorochrondochor Nope也不適合我。 –

回答

7

ucwords是PHP的核心功能,這是幸福無視非ASCII或非拉丁-1編碼一個*如需辦理字節字符串和/或非ASCII字符串,則應該使用多字節意識到mb_convert_case

mb_convert_case($str, MB_CASE_TITLE, 'UTF-8') 
// your string encoding here --------^^^^^^^ 

*我不完全確定它是否只適用於ASCII或至少與拉丁-1,但我甚至不打擾瞭解。

+0

它對我來說很好,謝謝! –

-1

ucwords不能識別重音字符。嘗試使用mb_convert_case

$str = 'GRANDE ÁRVORE'; 

function ucwords_accent($string) 
{ 
    if (mb_detect_encoding($string) != 'UTF-8') { 
     $string = mb_convert_case(utf8_encode($string), MB_CASE_TITLE, 'UTF-8'); 
    } else { 
     $string = mb_convert_case($string, MB_CASE_TITLE, 'UTF-8'); 
    } 
    return $string; 
} 

echo ucwords_accent($str); 
+0

你在做什麼編碼檢測和轉換?! *「如果字符串是UTF-8編碼,那麼utf8_encode ...」* ...?! – deceze

+0

@deceze感謝您發現錯誤,更新了答案。 – Danieloplata

+0

這還不是很好。 1)'mb_detect_encoding'只是可靠的,2)如果它不是* UTF-8它可能是任何東西,但'utf8_encode'只能處理拉丁-1,3)而不是轉換字符串,你可以簡單地改變第三個參數'mb_convert_case'到你的字符串所在的任何編碼,4)你應該*知道*你的字符串是什麼編碼,而不需要首先猜測和測試。 – deceze