(PHP 8 >= 8.4.0)
mb_ucfirst — Преобразовывает первый символ строки в верхний регистр
Функция выполняет операцию, аналогичную функции ucfirst() ,
но умеет безопасно обрабатывать строки, в которых символы кодируются переменным
количеством байтов.
Функция возвращает строку string,
первый символ которой привела к верхнему регистру.
stringencodingФункция возвращает преобразованную строку.
Замечание:
В отличие от стандартных функций сворачиваия и разворачивания регистра наподобие strtolower() и strtoupper() , преобразование регистра выполняется на основе свойств символов Юникода. Поэтому поведение функции не зависит от региональных настроек, а функция умеет преобразовывать символы с Юникод-свойством 'alphabetic' наподобие символа буквы «а» с умлаутом — ä.
Дополнительная информация о свойствах символов Юникода доступна по ссылке » 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.