我们在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之后É也会留下É。
但是接下来我会遇到É:XXXÉXXÉ
的问题答案 0 :(得分:8)
尝试使用多字节字符的mb_*
字符串函数。
echo mb_convert_case(mb_strtolower($str), MB_CASE_TITLE, "UTF-8");
答案 1 :(得分: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;
}