【问题标题】:ucwords and french accented lettres encoding [duplicate]ucwords和法语重音字母编码[重复]
【发布时间】:2012-04-04 13:53:28
【问题描述】:

我们有一个加拿大地址的数据库,全部都是大写字母,客户要求我们转换为小写,除了第一个字母和'-'之后的字母

所以我做了这个功能,但是我遇到了法语重音字母的问题。

当文件和字符集为 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É

【问题讨论】:

标签: php encoding utf-8 diacritics


【解决方案1】:

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

echo mb_convert_case(mb_strtolower($str), MB_CASE_TITLE, "UTF-8");

【讨论】:

  • 试过了......它会从字符串中完全删除重音字符。
【解决方案2】:

我在西班牙语中遇到了同样的问题,我创建了这个函数

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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-21
    • 2017-04-11
    • 2015-08-23
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 2018-09-13
    相关资源
    最近更新 更多