2010-03-25 5 views
47

I've asked about strtolower function. Aber wenn fremde Zeichen verwenden, funktioniert aber es ihnen nicht in Großbuchstaben umwandeln, also muss ich verwenden:ucfirst() Funktion für Multibyte-Zeichenkodierung

mb_strtolower($a,"utf8"); 

Aber was kann ich tun, wenn ich ucfirst() verwenden möchten Funktion? Ich habe keine ähnliche Funktion gefunden, bei der ich den Kodierungstyp einstellen kann.

+0

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

Antwort

87

Es gibt keine mb_ucfirst Funktion, wie Sie bereits bemerkt haben. Sie können fälschen mb_ucfirst mit zwei 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

Wie steht es mit den anderen benutzerdefinierten Funktionen? zum Beispiel, http://php.net/manual/en/function.ucfirst.php#108856 ** PS ** Ich weiß, ich kann TIAS, aber da viele Leute dieses Problem haben, kann jemand die Antwort bereits haben –

+4

Sie können tatsächlich Übergeben Sie NULL anstelle von $ strlen-1 und dann brauchen Sie nicht die erste Zeile. – ivanhoe

+0

Wirklich? Das klingt ein bisschen komisch. 'null' als dritter Parameter zu' mb_substr' bedeutet Länge minus eins? – zneak

1

Ich bin CP1250 auf die Homepage zu verwenden, und für Ú mb_ucfirst nicht funktioniert, so wenig Upgrade:

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

Für allgemeinere Verwendung sollte $ main_encoding entweder als optionaler Parameter oder von mb_internal_encoding() festgelegt werden . Sonst gut. –

53

Diese prägnanter Lösung ist, obwohl es ziemlich ähnlich ucwords Funktion ist:

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

Wenn Sie Zeichenfolge aus einem Wort besteht Kapital zu benötigen, ist es die beste Lösung.

+2

Fast die beste Antwort, aber ** Koralek M. ist nützlicher ** - es ist ** unempfindlich für die Änderung der Codierung ** Ihres www-Dienstes – fider

+1

@fider Dieser kann auch unempfindlich für die Änderung der Codierung sein, wenn Sie 'UTF weglassen -8 'Parameter. Wie für jeden mb_ * Funktionen –

+1

Funktioniert perfekt.Für alle Absichten und Zwecke ist dies das eingebaute 'mb_ucfirst'-Äquivalent in PHP. – Mahn

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

Sie sollten den Rest der Zeichenfolge nicht klein schreiben. –

+0

Funktioniert nicht. –

+0

Es funktioniert ok. Ist dies nicht der Fall, überprüfen Sie, ob die Funktionen von mb_ * überhaupt in Ihrer Umgebung funktionieren. – 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

Diese Funktion benötigt PHP/5.4.8 und höher. Außerdem müssen Sie wahrscheinlich ein gutes Gebietsschema festlegen und sicherstellen, dass 'mb_internal_encoding()' einen korrekten Wert zurückgibt. –

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

Das funktioniert nicht, sorry. –

+0

Seltsam ist, was ich benutze ... – goyote

+0

Es funktioniert ok. Ist dies nicht der Fall, überprüfen Sie, ob die Funktionen von mb_ * überhaupt in Ihrer Umgebung funktionieren. – cronfy

-2

Es ist die Funktion:

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

Wirklich ineffizient. –

+0

Dies ist keine Multi-Byte-Alternative zu 'ucfirst()'. Ich sehe eher aus wie eine Umschreibung von 'mb_convert_case (..., MB_CASE_TITLE)'. –

0

Arbeits (Einheit getestet) Version für moderne PHP:

<?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

Funktioniert nicht für meine russischen Saiten. – vatavale

+0

Dies sollte für PHP/5.4.8 + und UTF-8-Strings in UTF-8-konfigurierten Umgebungen funktionieren. Zwei Dinge sind jedoch unklar: Der "Unit-Test" -Teil (es sind keine Tests enthalten) und warum die Kodierung an einer Stelle fest als UTF-8 kodiert ist und in anderen als Standard-Version. –

-1

Gehen Sie mit diesem Mate:

$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

Diese Alternative zu 'ucfirst()' enthält nicht nur 'ucfirst()', sondern verhält sich auch nicht wie 'ucfirst()'. Ich vermute, du hast die Frage falsch verstanden. [[Online-Demo] (https://3v4l.org/5iJNj)] –

+0

@ ÁlvaroGonzález versuche jetzt, ich habe meine Antwort oben behoben. Testen Sie es hier [[Online-Demo] (https://3v4l.org/R2L2O)]. – Sid

0

Dies ist die kürzeste, die ich herausfinden kann ... extrahieren Sie das erste Wort, wenden Sie MB_CASE_TITLE an und ersetzen Sie es durch das Original.

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