68 votes

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

J'ai posé des questions sur strtolower función. Mais lorsque j'utilise des caractères étrangers, il ne les convertit pas en majuscules, je dois donc utiliser :

 mb_strtolower($a,"utf8");

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

0 votes

0 votes

P.S. Il existe un paquet du compositeur avec une implémentation correcte de mbUcFirst(). github.com/cofirazak/phpMissingFunctions

120voto

zneak Points 45458

Il n'y a pas mb_ucfirst comme vous l'avez déjà remarqué. Vous pouvez simuler une mb_ucfirst avec deux mb_substr :

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

1 votes

Comment cela se compare-t-il avec les autres fonctions personnalisées entrées par les utilisateurs ? par exemple, php.net/manual/fr/function.ucfirst.php#108856 PS Je sais que je peux utiliser TIAS mais comme beaucoup de personnes ont ce problème, quelqu'un a peut-être déjà la réponse.

7 votes

Vous pouvez en fait passer NULL au lieu de $strlen-1 et alors vous n'avez pas besoin de la première ligne.

0 votes

Vraiment ? Ça semble un peu bizarre. null comme troisième paramètre à mb_substr signifie longueur moins un ?

74voto

Alex Belyaev Points 230

Il s'agit d'une solution plus concise, bien qu'elle soit assez similaire à la solution suivante ucwords fonction :

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

Si vous devez mettre en majuscules une chaîne de caractères composée d'un seul mot, c'est la meilleure solution.

2 votes

C'est presque la meilleure réponse mais Koralek M. est plus utile - c'est insensible au changement d'encodage de votre service www

1 votes

@fider Celui-ci peut également être insensible au changement d'encodage si vous omettez le paramètre 'UTF-8'. Comme pour toutes les fonctions mb_*

2 votes

Fonctionne parfaitement. À toutes fins utiles, il s'agit de la version intégrée de l'appareil. mb_ucfirst équivalent en PHP.

24voto

Koralek M. Points 584
function mb_ucfirst($string)
{
    return mb_strtoupper(mb_substr($string, 0, 1)).mb_substr($string, 1);
}

22 votes

Vous ne devez pas mettre le reste de la chaîne en minuscules.

0 votes

Il fonctionne correctement. Si ce n'est pas le cas, vérifiez si les fonctions mb_* fonctionnent dans votre environnement.

0 votes

Cette fonction nécessite PHP/5.4.8 et plus. De plus, vous devez probablement définir une bonne locale et vous assurer que la fonction mb_internal_encoding() renvoie une valeur correcte.

2voto

J'utilise cp1250 sur une page web, et pour Ú mb_ucfirst ne fonctionne pas, donc petite mise à jour :

  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 votes

Pour une utilisation plus générale, $main_encoding doit être défini comme un paramètre optionnel ou par mb_internal_encoding(). Sinon, c'est bon.

0voto

user3302248 Points 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 votes

Cette fonction nécessite PHP/5.4.8 et plus. De plus, vous devez probablement définir une bonne locale et vous assurer que la fonction mb_internal_encoding() renvoie une valeur correcte.

0 votes

Ce conseil a été donné précédemment. Cette réponse en code seulement est redondante.

1 votes

La valeur par défaut devrait être mb_internal_encoding() , pas UTF-8 =/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X