2014-05-13 12 views
6

Ho una stringa con tutte le lettere maiuscole. Sto usando le funzioni ucwords() e mb_strtolower() per capitalizzare solo la prima lettera di una stringa. Ma sto avendo dei problemi quando la prima lettera di una parola ha un accento. Ad esempio:ucwords non in maiuscolo lettere accentate

ucwords(mb_strtolower('GRANDE ÁRVORE')); //outputs 'Grande árvore' 

Perché la prima lettera della seconda parola non viene maiuscola? Cosa posso fare per risolvere questo?

+1

La conversione del caso è più difficile di quanto si pensi. Hai provato ['mb_convert_case()'] (http://php.net/manual/en/function.mb-convert-case.php) con la modalità titolo? – Maerlyn

+0

Funziona bene per me: 'echo ucwords (mb_strtolower ('GRANDE ÁRVORE'));' risultato 'Grande Árvore'. Prova ad attivare la visualizzazione degli errori e dicci se si presenta qualche errore. – Chorochrondochor

+0

@Chorochrondochor Nope non funziona neanche per me. –

risposta

7

ucwords è una delle funzioni principali di PHP che è beatamente ignaro di non-ASCII o non-Latin-1 codifiche * Per la gestione stringhe multibyte e/o stringhe non-ASCII, è necessario utilizzare il multibyte consapevoli mb_convert_case:.

mb_convert_case($str, MB_CASE_TITLE, 'UTF-8') 
// your string encoding here --------^^^^^^^ 

* non sono del tutto sicuro se funziona solo con ASCII o almeno con Latin-1, ma non avrei nemmeno la briga di scoprire.

+0

Ha funzionato bene per me, grazie! –

-1

ucwords non riconosce il carattere accentato. Prova a utilizzare mb_convert_case.

$str = 'GRANDE ÁRVORE'; 

function ucwords_accent($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; 
} 

echo ucwords_accent($str); 
+0

Cosa stai facendo con quel rilevamento e conversione della codifica ?! * "Se la stringa è codificata in UTF-8, utf8_encode è ..." * ...?! – deceze

+0

@deceze Grazie per aver individuato l'errore, risposta aggiornata. – Danieloplata

+0

Non è ancora bello. 1) 'mb_detect_encoding' è tutto tranne che affidabile, 2) se * non * è UTF-8 * potrebbe * essere qualsiasi cosa, ma' utf8_encode' gestisce solo Latin-1, 3) invece di convertire la stringa potresti semplicemente cambiare il terzo parametro di 'mb_convert_case' a qualsiasi codifica della stringa, 4) dovresti * sapere * in che cosa consiste la codifica della stringa e non è necessario indovinare e testare in primo luogo. – deceze

Problemi correlati