ucfirst()函数用于多字节字符编码

Sim*_*mon 57 php character-encoding

我问过strtolower功能.但是当使用外来字符时,它不会将它们转换为大写,所以我必须使用:

 mb_strtolower($a,"utf8");
Run Code Online (Sandbox Code Playgroud)

但是,如果我想使用ucfirst()功能,我该怎么办?我没有找到任何类似的功能,我可以设置编码类型.

zne*_*eak 106

没有任何mb_ucfirst功能,正如您已经注意到的那样.你可以伪造一个mb_ucfirst两个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;
}
Run Code Online (Sandbox Code Playgroud)

  • 你实际上可以传递NULL而不是$ strlen-1然后你不需要第一行. (4认同)
  • 这不适合我.根据http://www.php.net/manual/de/function.mb-substr.php#77515:"传递null作为长度不会使mb_substr使用它的默认值,而是将其解释为0". (3认同)
  • @exizt那是因为你使用的是旧的PHP版本.http://php.net/manual/en/function.mb-substr.php#refsect1-function.mb-substr-changelog (3认同)

Ale*_*aev 63

这是更简洁的解决方案,虽然它与ucwords功能非常相似:

$final_string = mb_convert_case($your_string, MB_CASE_TITLE, 'UTF-8');
Run Code Online (Sandbox Code Playgroud)

如果你需要大写字符串由一个单词组成,那么它是最好的解决方案.

  • 这并不完美,因为它将所有单词中的第一个字母更改为大写.Ucfirst应该只改变第一个单词. (18认同)
  • 这将触及字符串中的每个单词,这不是 ucfirst() 所做的。-1 (5认同)
  • 几乎是最好的答案,但**Koralek M.更有用** - 它对你的www服务的编码改变**不敏感** (2认同)
  • 完美运作。出于所有目的和目的,这是PHP中的内置mb_ucfirst等效项。 (2认同)

Kor*_* M. 18

function mb_ucfirst($string)
{
    return mb_strtoupper(mb_substr($string, 0, 1)).mb_strtolower(mb_substr($string, 1));
}
Run Code Online (Sandbox Code Playgroud)

  • 你不应该小写字符串的其余部分. (21认同)

goy*_*ote 9

if (!function_exists('mb_ucfirst'))
{
    function mb_ucfirst($value)
    {
        return mb_strtoupper(mb_substr($value, 0, 1)) . mb_substr($value, 1);
    }
}
Run Code Online (Sandbox Code Playgroud)


han*_*rik 9

截至 2019 年 11 月 18 日,似乎 stackoverflow 上没有人做到这一点,以下是 mb_ucfirst() 应如何在用户空间中实现:

function mb_ucfirst(string $str, string $encoding = null): string
{
    if ($encoding === null) {
        $encoding = mb_internal_encoding();
    }
    return mb_strtoupper(mb_substr($str, 0, 1, $encoding), $encoding) . mb_substr($str, 1, null, $encoding);
}
Run Code Online (Sandbox Code Playgroud)

  • PS:如果您好奇,我在其他每个答案中都添加了评论,解释了我认为他们错了的地方。 (2认同)