ucwords和编码法语重音的lettres(ucwords and french accented

2019-09-16 08:41发布

我们都在CAPS加拿大地址的数据库,客户要求我们转换成小写想到的第一个字母和字母后“ - ”

所以我做了这个功能,但我有与法国重音字母的问题。

具有文件和字符集为ISO-88591。当它工作正常,但是当我试图使它UTF-8就不再工作了。

输入的例子:“达明克劳德élanger”输出:达明克劳德élanger

在E 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留É。

但后来我不得不在内部具有前e的问题:XXXÉXXÉ

Answer 1:

尝试mb_*字符串函数的多字节字符。

echo mb_convert_case(mb_strtolower($str), MB_CASE_TITLE, "UTF-8");


Answer 2:

我在西班牙同样的问题,我创建这个功能

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;
}


文章来源: ucwords and french accented lettres encoding