3
$word = "слово";

как сделать:

$word = "словО";

2 Answers2

7

Для многобайтовых строк, таких как UTF-8 сущестуют специальные функции:

$enc = 'UTF-8';
$word = "слово";
$count = mb_strlen($word, $enc); //Узнаем количество символов в MB строке
$new_word = mb_substr($word, 0, ($count - 1), $enc);
$new_word = $new_word . mb_strtoupper(mb_substr($word,($count - 1), 1, $enc), $enc);
echo $new_word;

Результат будет: словО.

Функции с приставкой mb_ учитывают что символы могут быть разного размера. Например:

$str = 'FФ'; //Первый символ латиницей, второй кириллицей

$size = strlen($str);
//Для строки в UTF-8 вернет 3

$size = mb_strlen($str);
//Для строки в UTF-8 вернет 2

Это источник многих ошибок для начинающего программиста.

Максим
  • 2,324
  • только нужно учитывать особенности unicode. mb_strlen(Й) == 1, а mb_strlen(Й) == 2 (во втором случае это две кодовые точки - И и диакритический знак Кратка) – Герман Борисов Sep 05 '18 at 07:40
  • Если необходимо узнать количество "печатных символов" в строке, то необходимо перед mb_strlen удалить все диакритические знаки (можно попробовать через $result = iconv($src_enc, 'ASCII//TRANSLIT', $str)); – Максим Sep 05 '18 at 08:00
-3
$str = "привет мир";  
$last = strlen($str)-1;
list($str[$last-1], $str[$last]) = mb_strtoupper($str[$last-1].$str[$last], 'UTF8');  
echo $str;
  • 1
    strlen не учитывает UTF-8. Вы получите ошибку с большой вероятностью. – Максим Sep 05 '18 at 09:11
  • mad Jerico Пожалуйста, не переходите на личности. Поставил флаг на комментарии. Ответу кстати минус - он действительно неправильный. – A K Sep 05 '18 at 09:34
  • вопрос платформы.. – mad Jerico Sep 05 '18 at 13:19