web-dev-qa-db-fra.com

fonction ucfirst () pour les codages de caractères multi-octets

J'ai posé des questions sur la fonction strtolower. Mais quand on utilise des caractères étrangers, cela ne les convertit pas en majuscules, je dois donc utiliser:

 mb_strtolower($a,"utf8");

Mais que puis-je faire si je veux utiliser la fonction ucfirst()? Je n'ai pas trouvé de fonction similaire, où je peux définir le type de codage.

54
Simon

Il n'y a pas de fonction mb_ucfirst, comme vous l'avez déjà remarqué. Vous pouvez simuler un mb_ucfirst avec deux 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;
}
97
zneak

C'est une solution plus concise, bien que similaire à la fonction ucwords

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

Si vous devez capitaliser une chaîne composée d'un mot, c'est la meilleure solution.

59
Alex Belyaev
function mb_ucfirst($string)
{
    return mb_strtoupper(mb_substr($string, 0, 1)).mb_strtolower(mb_substr($string, 1));
}
16
Koralek M.
if (!function_exists('mb_ucfirst'))
{
    function mb_ucfirst($value)
    {
        return mb_strtoupper(mb_substr($value, 0, 1)) . mb_substr($value, 1);
    }
}
8
goyote

J'utilise cp1250 sur la page Web, et pour mb_ucfirst ne fonctionne pas, mise à niveau si faible

  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 );
}
2
Jaroslav Štreit
/*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;
}
1
user3302248
$string = trim(preg_replace('/\s+/', ' ', $string));
$string_ar = explode(' ', mb_strtolower($string,'utf-8'));

foreach($string_ar as $key => $value {
  $string_str .= mb_convert_case(mb_substr(trim($value), 0, 1), MB_CASE_TITLE, 'utf-8')
    . mb_substr(trim($value),1)
    . ' ';
}

$string = trim($string_str);
0
Paris Z

Version de travail (test unitaire) pour PHP moderne:

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

C’est le plus court que je puisse comprendre ... extrayez d’abord le mot, appliquez MB_CASE_TITLE et remplacez-le par l’original.

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

0
degeaba