2010-03-25 11 views
47

I've asked about strtolower function. Pero cuando se utilizan caracteres extranjeros que no convertirlos en mayúsculas, por lo que debe utilizar:ucfirst() función para la codificación de caracteres de varios bytes

mb_strtolower($a,"utf8"); 

Pero, ¿qué puedo hacer yo, si quiero usar ucfirst() ¿función? No he encontrado ninguna función similar, donde puedo establecer el tipo de codificación.

+0

Tal vez esto: http://www.if-not-true-then-false.com/2010/php-mb_ucfirst-make-a-strings-first-character-uppercase-multibyte-function/ – user956584

Respuesta

87

No existe la función mb_ucfirst, como ya habrás notado. Usted puede fingir un mb_ucfirst con dos mb_substr:

function mb_ucfirst($string, $encoding) 
{ 
    $strlen = mb_strlen($string, $encoding); 
    $firstChar = mb_substr($string, 0, 1, $encoding); 
    $then = mb_substr($string, 1, $strlen - 1, $encoding); 
    return mb_strtoupper($firstChar, $encoding) . $then; 
} 
+0

¿cómo se compara esto con las otras funciones personalizadas introducidas por los usuarios? por ejemplo, http://php.net/manual/en/function.ucfirst.php#108856 ** PD ** Sé que puedo TIAS, pero como muchas personas tienen este problema, es posible que alguien ya tenga la respuesta –

+4

que realmente puede pase NULL en lugar de $ strlen-1 y luego no necesita la primera línea. – ivanhoe

+0

¿De verdad? Eso suena un poco raro. 'null' como un tercer parámetro para' mb_substr' significa longitud menos uno? – zneak

1

estoy usando CP1250 en la página web, y para u mb_ucfirst Indiferente trabajo, tan poco actualización:

function mb_ucfirst($string) 
{ 
    $main_encoding = "cp1250"; 
    $inner_encoding = "utf-8"; 
    $string = iconv($main_encoding, $inner_encoding , $string); 
    $strlen = mb_strlen($string); 
    $firstChar = mb_substr($string, 0, 1, $inner_encoding); 
    $then = mb_substr($string, 1, $strlen - 1, $inner_encoding); 
    return $string = iconv($inner_encoding, $main_encoding , mb_strtoupper($firstChar, $inner_encoding) . $then); 
} 
+1

Para un uso más general, $ main_encoding debe establecerse como un parámetro opcional o mediante mb_internal_encoding() . De lo contrario, bien. –

53

Esta es la solución más concisa, aunque es bastante similar a ucwords función:

$final_string = mb_convert_case($your_string, MB_CASE_TITLE, 'UTF-8'); 

Si necesita sacar provecho de cadena constan de una sola palabra, es la mejor solución.

+2

Casi la mejor respuesta pero ** Koralek M. es más útil ** - es ** insensible al cambio de codificación ** de su servicio www – fider

+1

@fider Este también puede ser insensible al cambio de codificación si omite 'UTF -8 'parámetro. Como para cada mb_ * funciones –

+1

Funciona a la perfección.Para todos los efectos, este es el equivalente 'mb_ucfirst' incorporado en PHP. – Mahn

14
function mb_ucfirst($string) 
{ 
    return mb_strtoupper(mb_substr($string, 0, 1)).mb_strtolower(mb_substr($string, 1)); 
} 
+13

No debe minúsculas el resto de la cadena. –

+0

No funciona. –

+0

Está funcionando bien. Si no es así, compruebe si las funciones mb_ * funcionan en su entorno. – cronfy

1
/*This worked correctly for me*/ 
function mb_ucfirst($string, $encoding='UTF-8') 
{ 
    $firstChar = mb_substr($string, 0, 1, $encoding); 
    $then = mb_substr($string, 1, mb_strlen($string, $encoding)-1, $encoding); 
    return mb_strtoupper($firstChar, $encoding) . $then; 
} 
+0

Esta función requiere PHP/5.4.8 y superior. Además, probablemente necesite establecer una buena configuración regional y asegurarse de que 'mb_internal_encoding()' devuelva un valor adecuado. –

7
if (!function_exists('mb_ucfirst')) 
{ 
    function mb_ucfirst($value) 
    { 
     return mb_strtoupper(mb_substr($value, 0, 1)) . mb_substr($value, 1); 
    } 
} 
+0

Esto no está funcionando, lo siento. –

+0

Extraño es lo que uso ... – goyote

+0

Está funcionando bien. Si no es así, compruebe si las funciones mb_ * funcionan en su entorno. – cronfy

-2

Es la función:

function FirstCharString($string){ 
     $aString = explode(' ', $string); 
     $sReturn = ''; 
     foreach ($aString as $k=>$fString) { 
      $sFirst = mb_strtoupper(mb_substr($fString, 0, 1)); 
      $sMore = mb_strtolower(mb_substr($fString, 1)); 
      $sReturn .= $sFirst.$sMore.' '; 
     } 
     return trim($sReturn); 
    } 
+0

Realmente ineficiente. –

+0

Esto no es una alternativa de varios bytes a 'ucfirst()'. Me parece más una reescritura de 'mb_convert_case (..., MB_CASE_TITLE)'. –

0

de trabajo (unidad de prueba) versión para PHP moderna:

<?php 

function mb_ucfirst($value) 
{ 
    $firstLetter = mb_strtoupper(mb_substr($value, 0, 1, 'UTF-8'), 'UTF-8'); 
    $otherLetters = mb_substr($value, 1, null, 'UTF-8'); 

    return $firstLetter . $otherLetters; 
} 

echo mb_ucfirst('żółta źółć'); 
var_dump('Żółta źółć' === mb_ucfirst('żółta źółć')); 
+0

No funciona para mis cadenas rusas. – vatavale

+0

Esto debería funcionar bien para cadenas PHP/5.4.8 + y UTF-8 en entornos configurados UTF-8. Sin embargo, hay dos cosas que no están claras: la parte "unidad probada" (no se incluyen pruebas) y por qué la codificación está codificada como UTF-8 en un lugar y dejada en otros por defecto. –

-1

Ir con este compañero:

$text = "ρασąŽUOlas ΔρασΥκελίζει niekπέΥąΥžuoρ kυνόσ"; 
$ucfirsted_text = mb_convert_case(mb_substr($text,0,1), MB_CASE_TITLE, "UTF-8").mb_substr($text,1); 

echo $ucfirsted_text; //will print you "ΡασąŽUOlas ΔρασΥκελίζει niekπέΥąΥžuoρ kυνόσ" 
+0

Esta alternativa a 'ucfirst()' no solo incluye 'ucfirst()' sino que tampoco se comporta como 'ucfirst()'. Sospecho que malinterpretaste la pregunta. [[Demostración en línea] (https://3v4l.org/5iJNj)] –

+0

@ ÁlvaroGonzález inténtelo ahora, he solucionado mi respuesta anterior. Pruébelo aquí [[Demo en línea] (https://3v4l.org/R2L2O)]. – Sid

0

Esto es lo más corto que puedo deducir ... extraer la primera palabra, aplicar MB_CASE_TITLE y reemplazarlo por el original.

function mb_ucfirst($str=''){ $str2=explode(" ",$str); return str_replace($str2[0],mb_convert_case($str2[0], MB_CASE_TITLE, "UTF-8"),$str); }

Cuestiones relacionadas