2012-04-04 6 views
4

Wir haben eine Datenbank der kanadischen Adressen alle in CAPS, der Kunde verlangt, dass wir verwandeln Fall senken den ersten Buchstaben erwarten und den Brief nach einem ‚-‘ucwords und französisch akzentuierte lettres kodieren

Also habe ich diese Funktion , aber ich habe ein Problem mit französischen Akzentbuchstaben.

Wenn Sie die Datei und den Zeichensatz als ISO-88591 haben, funktioniert es gut, aber wenn ich versuche, es UTF-8 zu machen, funktioniert es nicht mehr.

Beispiel Eingabe: 'damien-claude élanger' Ausgang: Damien-Claude élanger

das é in utf-8 werden

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

Die andere Lösung, die ich im Sinn haben, ist zu do: ucwords (strtolower ($ str)), da alle Adressen bereits in Großbuchstaben geschrieben sind, so dass die É auch nach der Anwendung von strtolower É bleibt.

Aber dann werde ich habe das Problem, É innerhalb ex aufweist: XXXÉXXÉ

+0

'mb_strtoupper ("àáâçèéêë", 'UTF-8');' oder 'mb_strtolower' – Baba

+0

insted perfekt funktioniert gut Ähnlich und genau so gut: [Wie kyrillische Zeichen groß geschrieben werden?] (Http://stackoverflow.com/q/10012445/367456) – hakre

Antwort

7

Versuchen mb_* String-Funktionen für Mehrbyte-Zeichen.

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

hat das versucht ... Es wird das akzentuierte Zeichen vollständig aus der Zeichenkette entfernen. – Tarek

1

ich das gleiche Problem in Spanisch, und ich erstellen, um diese Funktion

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