8

Здравствуйте! У меня часто возникают проблемы с кодировками, в частности с отображением русских символов во всех более-менее современных браузерах. Вот еще один вопрос возник: Почему PHP-функция "ucfirst()" не работает для русских символов? Как можно "заставить" её работать? Или есть хотя бы альтернатива?

P.S Только банальщину с заменой букв по массиву предлагать не стоит.

Спасибо всем, кто откликнулся!

Nofate
  • 34,603
AseN
  • 13,629

4 Answers4

23

UTF-8, разумеется? PHP не может нормально работать с многобайтными кодировками. Наиболее близкое решение:

mb_internal_encoding("UTF-8");
function mb_ucfirst($text) {
    return mb_strtoupper(mb_substr($text, 0, 1)) . mb_substr($text, 1);
}
echo mb_ucfirst("тест\n");

На всякий случай, дополню: если вы до сих пор кипятите^W используете CP1251 или, упаси Его Макароннейшество, KOI8-R, то может помочь вызов setlocale, с однобайтными кодировками ucfirst кое-как работает:

setlocale(LC_CTYPE, "ru_RU.CP1251");
echo ucfirst("\xf2\xe5\xf1\xf2\n");

Но работать это будет только в случае, если в системе есть такая локаль. Т.е. как повезет.

drdaeman
  • 9,253
  • 1
  • 20
  • 37
  • Спасибо. Отлично все работает. Я вот тоже похожим способом пытался: перевести в верхний регистр первую букву, но не получилось. Еще раз спасибо. – AseN Apr 29 '12 at 17:58
  • Да не за что. Вы, наверное, mb_internal_encoding забыли когда пробовали — без него используется значение из конфига, а если оно там не задано (что, как правило, и есть), то творится черт-те что и ничего не работает. – drdaeman Apr 29 '12 at 18:05
  • 1
    Нет, я конечно же использую ТОЛЬКО "UTF-8". Это есть стандарт. – AseN Apr 29 '12 at 18:06
  • Ага, я уже понял, как только созранил и увидел «отлично работает», но не стал стирать. Пусть будет — кто-нибудь еще натолкнется на вопрос потом наверняка.

    А CP1251 иногда приходится использовать. Есть такое неприятное явление «поддержка legacy-систем», да. Избранными глухими местами еще KOI8-R стандарт. Правда, это все не в web, обычно.

    – drdaeman Apr 29 '12 at 18:08
14

Если используете utf-8 кодировку, то вам нужна функция mb_convert_case.

Пример:

$name = 'ярослав';
echo mb_convert_case($name, MB_CASE_TITLE, "UTF-8"); // Ярослав
  • 1
    Один минус - ставит в верхний регистр первую букву не только первого слова, но и вообще всех слов в строке. – Cheslab Oct 15 '17 at 01:32
0
$title = 'ASDASDASDASDASD';

$title = mb_strtolower($title, 'UTF-8');

$title = mb_strtoupper(mb_substr($title, 0, 1, 'UTF-8'), 'UTF-8') . mb_substr($title, 1, null,'UTF-8');

echo $title; // 'Asdasdasdasdasd'
lexxl
  • 5,542
  • Постарайтесь писать более развернутые ответы. Поясните, на чем основано ваше утверждение? – Nicolas Chabanovsky Apr 16 '16 at 07:23
0

Столкнулся с подобной проблемой - задача выводить имена пользователей в любой кодировке (кириллице, латинице и др.) из массива с большой буквы. Изобрел такое решение:

$names = array("катя", "МАША", "verONIka");

function fix_names($names) {
for ($n = 0; $n < 3; $n++) {
    $names [$n] = mb_strtolower($names[$n]); //все к нижнему регистру
    echo mb_convert_case("$names[$n]", MB_CASE_TITLE, "UTF-8")."\n"; //выводим с первым символом в верхнем регистре
}
} 

fix_names($names); //Катя Маша Veronika

Правда не знаю насколько правильно я все сделал, так как новичок и всего неделю изучаю PHP, но тем не менее данный код работает как и требовалось.

  • вот так точно не нужно делать работая с PHP: "$names[$n]", просто $names[$n] в идеале вообще не использовать синтаксис с двойными кавычками (особенно там где форматирование строк не нужно), а для форматирования использовать sprintf, работает лучше и спасает от неочевиных багов. – El' Nov 24 '17 at 05:10