私たちはカナダの住所のデータベースをすべて 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É 内にあるという問題が発生します。