ucwords и кодировка букв с французским акцентом

У нас есть база данных канадских адресов, написанных ЗАГЛАВНЫМИ БУКВАМИ, клиент запросил преобразование в нижний регистр, за исключением первой буквы и буквы после «-».

Итак, я сделал эту функцию, но у меня проблема с французскими буквами с акцентом.

При наличии файла и кодировки как ISO-88591 он работает нормально, но когда я пытаюсь сделать его UTF-8, он больше не работает.

Пример ввода: 'damien-claude élanger' вывод: Damien-Claude élanger

é в utf-8 станет �

 function cap_letter($string) {
            $lower     = str_split("àáâçèéêë");
            $caps      = str_split("ÀÁÂÇÈÉÊË");
            $letters   = str_split(strtolower($string));

            foreach($letters as $code => $letter) {
                if($letter === '-' || $letter === ' ') {
                    $position = array_search($letters[$code+1],$lower);
                    if($position !== false) {
                        // test
                        echo $letters[$code+1] . ' == ' . $caps[$position] ; 
                        $letters[$code+1] = $caps[$position];
                    }
                    else {
                        $letters[$code+1] = mb_strtoupper($letters[$code+1]);
                    } 
                }
            }
            //return ucwords(implode($letters)) ;
            return implode($letters) ;
        }

Другое решение, которое я имею в виду, это сделать: ucwords(strtolower($str)) поскольку все адреса уже указаны заглавными буквами, поэтому É останется É даже после применения strtolower .

Но тогда у меня возникнет проблема с наличием É внутри ex : XXXÉXXÉ


person Tarek    schedule 04.04.2012    source источник
comment
mb_strtoupper("àáâçèéêë", 'UTF-8'); или mb_strtolower отлично работает   -  person Baba    schedule 04.04.2012
comment
Аналогично и точно так же: Как сделать кириллические символы прописными?   -  person hakre    schedule 04.04.2012


Ответы (2)


Попробуйте mb_* строковые функции для многобайтовых символов.

echo mb_convert_case(mb_strtolower($str), MB_CASE_TITLE, "UTF-8");
person safarov    schedule 04.04.2012
comment
попробовал это... Он полностью удалит акцентированный символ из строки. - person Tarek; 04.04.2012

У меня такая же проблема на испанском языке, и я создаю эту функцию

function capitalize($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;
}
person sbarrat    schedule 18.01.2013