6

私たちはカナダの住所のデータベースをすべて CAPS で持っています。クライアントは、最初の文字と「-」の後の文字を期待して小文字に変換するように要求しました。

だから私はこの機能を作ったが、フランス語のアクセント付きの文字に問題がある.

ファイルと文字セットを 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É 内にあるという問題が発生します。

4

2 に答える 2

12

mb_*マルチバイト文字の文字列関数を試してください。

echo mb_convert_case(mb_strtolower($str), MB_CASE_TITLE, "UTF-8");
于 2012-04-04T13:55:06.853 に答える
1

スペイン語でも同じ問題があり、この関数を作成します

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;
}
于 2013-01-18T11:49:42.880 に答える