2012-04-04 79 views
4

我们有加拿大地址的数据库都在CAPS,客户要求我们转换成小写想到的第一个字母和字母后“ - ”ucwords和法国的重音lettres编码

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

当文件和字符集作为ISO-88591它工作正常,但是当我试图使它UTF-8它不再工作。输入的

例如: '达明克劳德élanger' 输出:达明克劳德élanger

在E 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之后,它仍然会保留。

但后来我不得不在内部具有前e的问题:XXXÉXXÉ

+0

'mb_strtoupper( “àáâçèéêë”, 'UTF-8');'或'mb_strtolower'工作完全正常insted的 – Baba 2012-04-04 14:02:21

+0

类似的,以及只是:[如何使西里尔字符大写?](http://stackoverflow.com/q/10012445/367456) – hakre 2012-04-04 14:21:48

回答

7

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

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

试图...它将从字符串中完全删除重音字符。 – Tarek 2012-04-04 14:05:22

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