ucwords not capitalizing accented letters

I have a string with all letters capitalized. I'm using the ucwords() and the mb_strtolower() functions to capitalize only the first letter of a string. But I'm having some problems when the first letter of a word have a accent. For example:

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

Why the first letter of the second word is not being capitalized? What can I do to solve this?

Upvotes: 15

Views: 5119

Answers (3)

JFC
JFC

Reputation: 586

If you're looking to only capitalize the first letter only, here's a way to achieve it :

$s = "économie collégiale"
mb_strtoupper( mb_substr( $s, 0, 1 )) . mb_substr( $s, 1 )
// output : Économie collégiale

Upvotes: 0

Danieloplata
Danieloplata

Reputation: 222

ucwords doesn't recognize the accented character. Try using 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);

Upvotes: -1

deceze
deceze

Reputation: 521994

ucwords is one of the core PHP functions which is blissfully oblivious to non-ASCII or non-Latin-1 encodings.* For handling multibyte strings and/or non-ASCII strings, you should use the multibyte aware mb_convert_case:

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

* I'm not entirely sure whether it works only with ASCII or at least with Latin-1, but I wouldn't even bother to find out.

Upvotes: 26

Related Questions