首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ucwords和法语重音字母编码

ucwords和法语重音字母编码
EN

Stack Overflow用户
提问于 2012-04-04 21:53:29
回答 2查看 5K关注 0票数 6

我们有一个加拿大地址的数据库,全部用大写字母,客户要求我们转换为小写,希望第一个字母和字母后的'-‘。

所以我做了这个函数,但我在处理法语重音字母时遇到了问题。

当文件和字符集为ISO-88591时,它可以正常工作,但当我尝试将其设置为UTF-8时,它就不再起作用了。

输入示例:'damien-claudeélanger‘输出: Damien-Claudeélanger

utf-8中的é将变为�

代码语言:javascript
复制
 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.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-04 21:55:07

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

代码语言:javascript
复制
echo mb_convert_case(mb_strtolower($str), MB_CASE_TITLE, "UTF-8");
票数 11
EN

Stack Overflow用户

发布于 2013-01-18 19:49:43

我在西班牙语中也有同样的问题,所以我创建了这个函数

代码语言:javascript
复制
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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10012545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档