Функция ucfirst() для многобайтовых кодировок
Я спрашивал о strtolower
функция. Но при использовании иностранных символов он не конвертирует их в верхний регистр, поэтому я должен использовать:
mb_strtolower($a,"utf8");
Но что я могу сделать, если я хочу использовать ucfirst()
функционировать? Я не нашел подобной функции, где я мог бы установить тип кодировки.
9 ответов
Здесь нет 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;
}
Это более краткое решение, хотя оно довольно похоже на ucwords
функция:
$final_string = mb_convert_case($your_string, MB_CASE_TITLE, 'UTF-8');
Если вам нужно использовать заглавные буквы, состоящие из одного слова, это лучшее решение.
function mb_ucfirst($string)
{
return mb_strtoupper(mb_substr($string, 0, 1)).mb_strtolower(mb_substr($string, 1));
}
По состоянию на 18.11.2019 кажется, что никто в stackru не получил этого права, вот как 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);
}
if (!function_exists('mb_ucfirst'))
{
function mb_ucfirst($value)
{
return mb_strtoupper(mb_substr($value, 0, 1)) . mb_substr($value, 1);
}
}
Я использую cp1250 на веб-странице, и для Ú mb_ucfirst не работает, поэтому небольшое обновление:
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 );
}
/*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;
}
Рабочая (модульная) версия для современного PHP:
<?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 źółć'));
Это самое короткое, что я могу понять... извлечь первое слово, применить MB_CASE_TITLE и заменить его оригиналом.
function mb_ucfirst($str=''){
$str2=explode(" ",$str);
return str_replace($str2[0],mb_convert_case($str2[0], MB_CASE_TITLE, "UTF-8"),$str);
}
Перейти с этим помощником:
$text = "ρασąŽUOlas ΔρασΥκελίζει niekπέΥąΥžuoρ kυνόσ";
$ucfirsted_text = mb_convert_case(mb_substr($text,0,1), MB_CASE_TITLE, "UTF-8").mb_substr($text,1);
echo $ucfirsted_text; //will print you "ΡασąŽUOlas ΔρασΥκελίζει niekπέΥąΥžuoρ kυνόσ"
$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);