Что именно вызывает проблемы у кода при работе с кириллицей?

Как можно посчитать процентное содержание каждого символа в тексте, учитывая, что код правильно обрабатывает английские символы, но выдает «кракозябры» на кириллице и отображает проценты как «0»? <br/><br/> <pre><code class="php">// исходная строка
$string = 'тестовая строка';

// строка с удаленными пробелами
$string = str_replace(' ', '', $string);

// строка, где удалены все повторяющиеся символы
$uniqueSymbols = implode(array_unique(mb_str_split($string, 1)));

// перебираем строку через цикл for
for ($i = 0; $i &lt; mb_strlen($uniqueSymbols); $i++) {
         // символ строки           формула
    echo $uniqueSymbols[$i] .' - '. round((mb_substr_count($string, $string[$i]) / mb_strlen($string)) * 100, 1) . ' %&lt;br&gt;&lt;br&gt;';
}</code></pre> <br/><br/>
  • 3 октября 2024 г. 17:04
Ответы на вопрос 2
Проблемы с обработкой кириллицы в вашем коде могут возникать по нескольким причинам:

1. **Кодировка**: Убедитесь, что файл с кодом и строка `$string` находятся в правильной кодировке, обычно это UTF-8. Если ваш PHP-файл сохранён в другой кодировке, это может привести к ошибкам при работе с многобайтовыми символами, такими как кириллица.

2. **Функции для многобайтовых строк**: Использование функций `mb_strlen`, `mb_substr_count` и `mb_str_split` вместо стандартных функций `strlen`, `substr` и `str_split` необходимо, чтобы корректно обрабатывать строки, содержащие многобайтовые символы.

3. **Ошибки в индексации**: При обращении к символам строки с помощью `$uniqueSymbols[$i]` вы должны гарантировать, что `$uniqueSymbols` обработан правильно.

С учетом всех этих аспектов, исправленный вариант вашего кода может выглядеть так:

```php
// Установим кодировку по умолчанию
mb_internal_encoding("UTF-8");

// Исходная строка
$string = 'тестовая строка';

// Строка с удаленными пробелами
$string = str_replace(' ', '', $string);

// Строка, где удалены все повторяющиеся символы
$uniqueSymbols = implode("", array_unique(mb_str_split($string, 1)));

// Перебираем строку через цикл for
for ($i = 0; $i < mb_strlen($uniqueSymbols); $i++) {
    // Получаем текущий символ
    $currentSymbol = mb_substr($uniqueSymbols, $i, 1);
    // Считаем процентное содержание текущего символа
    $percentage = mb_substr_count($string, $currentSymbol) / mb_strlen($string) * 100;
    // Выводим символ и процент
    echo $currentSymbol . ' - ' . round($percentage, 1) . ' %<br><br>';
}
```

Обратите внимание на следующие изменения:
- Установлена кодировка по умолчанию с помощью `mb_internal_encoding("UTF-8");`.
- Вместо `$string[$i]` используется `mb_substr($uniqueSymbols, $i, 1)` для получения символа. Это важно, так как `$uniqueSymbols` теперь может содержать такую же многобайтовую строку. 

Эти изменения должны помочь вашему коду корректно обрабатывать кириллицу и правильно вычислять процентное содержание символов.
Потому что кириллица, когда ты берешь $uniqueSymbols[$i] ты берешь не итую букву, а итый байт <br/> <br/> <pre><code class="php">$letter = mb_substr($uniqueSymbols, $i, 1);
echo $letter .' - '. round((mb_substr_count($string, $letter) / mb_strlen($string)) * 100, 1) . ' %&lt;br&gt;&lt;br&gt;';</code></pre>
Похожие вопросы