我们有一个加拿大地址的数据库,全部用大写字母,客户要求我们转换为小写,希望第一个字母和字母后的'-‘。
所以我做了这个函数,但我在处理法语重音字母时遇到了问题。
当文件和字符集为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) ;
}我脑海中的另一个解决方案是:ucword( strtolower ($str)),因为所有的地址都是大写的,所以即使在应用strtolower之后,É也会留在É。
但是这样我就会有一个问题,那就是在ex内部使用ex:xxxxxx.
发布于 2012-04-04 21:55:07
尝试使用多字节字符的mb_*字符串函数。
echo mb_convert_case(mb_strtolower($str), MB_CASE_TITLE, "UTF-8");发布于 2013-01-18 19:49:43
我在西班牙语中也有同样的问题,所以我创建了这个函数
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;
}https://stackoverflow.com/questions/10012545
复制相似问题