Почему функция для строки на русском языке работает не так как для строки на английском?

Столкнулся с такой интересной проблемой.

   function replacingLettersSingString(string $str):string{
        $arr=explode(' ',$str);

        $newStr='';

        foreach($arr as $word){
            if(strlen($word)>=5) $newStr.=self::replacingLettersSingWord($word);
            else $newStr.=" $word";
        }

        return $newStr;
    }

    function replacingLettersSingWord(string $str):string{
        $result=' ';
    
        for($i=0;$i<strlen($str);$i++){
            if($i<=5) $result.=$str[$i];
            else break;
        }
    
        return $result.='*';;
    }



replacingLettersSingString('I bought an armored personnel carrier').'<br>';

replacingLettersSingString('я купив бронетранспортер учора');

Вывод такой:

I bought* an armore* person* carrie*
я куп* бро* учо*

Подскажите пожалуйста почему с строкой на английском все нормально, а со строкой на русском/украинском не работает как надо и как это исправить?


Ответы (2 шт):

Автор решения: Алексей Шиманский

Русский - многобайтовый язык %) (точнее строки)

Надо использовать функции с приставкой mb_

См. список функций в доках:

https://www.php.net/manual/ru/ref.mbstring.php

→ Ссылка
Автор решения: Денис Сепетов

Верно сказали - не хватает пакета mbstring. Установите его в систему. Если у вас что-то похожее на ubuntu, то примерно так:

sudo apt install php-mbstring

Название пакета может отличаться. Например, php8.1-mbstring. А потом вместо стандартных функций работы со строками нужно будет использовать их.

Вероятно, после установки ещё потребуется поправить php.ini, раскомментировав строчку:

extension=mbstring
→ Ссылка