(PHP 8 >= 8.4.0)
mb_ucfirst — Make a string's first character uppercase
Performs a multi-byte safe ucfirst() operation,
and returns a string with the first character of
string title-cased.
stringencodingReturns the resulting string.
Note:
By contrast to the standard case folding functions such as strtolower() and strtoupper() , case folding is performed on the basis of the Unicode character properties. Thus the behaviour of this function is not affected by locale settings and it can convert any characters that have 'alphabetic' property, such a-umlaut (ä).
For more information about the Unicode properties, please see » http://www.unicode.org/reports/tr21/.
For non-english words enconded in utf-8 works mb_convert_case with MB_CASE_TITLE option
mb_convert_case(mb_substr($str, 0, 1), MB_CASE_TITLE) . mb_substr($str, 1);
For a single word
echo mb_convert_case('çağla', MB_CASE_TITLE);
https://stackoverflow.com/questions/25729900/ucfirst-doesnt-work-on-non-english-characters polyfill:
<?php
if(PHP_VERSION_ID < 80400) {
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);
}
}
?>
if you wonder why i bother with mb_internal_encoding: prior to php7, $encoding was not nullable. if your polyfill don't need php5.6 support, you can drop it.