Проблемы при попытке перевести проект в кодировку UTF-8

Пришла задача привести проект самописной CMS в PSR-12, а значит кодировка файлов приложения должна быть UTF-8 (No BOM). Я, с помощью PHPStorm, разом перевел все документы в UTF-8 (settings -> editor -> File Encoding -> Ставлю UTF-8 -> в таблицу добавляю директорию проекта -> with NO BOM -> Apply). Частично проект был написан на Windows-1251,по- этому многие файлы внутри теперь содержат строки с абра-кадабрами и вообще на сайте достаточно криво отображаются. Подскажите пожалуйста, как можно это исправить и как правильно было бы переводить файлы из 1251 в UTF?

UPD: На сколько я понял, IDE мне не меняет кодировку файлов, а только временно ее использует, тогда остается вопрос, как поменять кодировку всего проекта (он очень большой), и при этом не получить каракули?

UPD2: В целом нашел скрипт, который мне помог конвертировать весь проект с помощью функции iconv() Однако теперь появилась ошибка Fatal error: Uncaught Error: Class "PHPExcel_Shared_String" not found in .../Autoloader.php:11

UPD3: Нашел ошибку: некоторые файлы после конвертации почему- то становятся пустыми. Код обработчика прикрепляю. Помогите пожалуйста.

 <?php

    ini_set('display_errors', 1);
    error_reporting(E_ERROR);


// Конвертер модуля ссылок

// Входные данные
// $source ....... - путь к директории, например my_script_w1251/scripts (в конце слеш не нужен)
// $ext_convert ... - массив с разрешенными расширениями файлов - только файлы с указанными разрешениями будут конвертироваться. Например: array('php', 'inc');
// $exclude ...... - массив с файлами и директориями, данные которых конвертировать запрещено. Например: array('dir' => array('mod', 'lib/scripts'), 'file' => array('lib/index.php'))
// $convert ...... - флаг (1 перезаписывать файлы, 0 - только прочитать/проверить доступ на запись)
// $result ....... - стоит оставить пустым, используется для передачи данных при рекурсивном проходе директорий

// Результат выполнения - $result = win1251_to_utf8()
// $result['output_txt'] ... - текстовый вывод в HTML результатов выполнения функции: черный цвет - найденный файл подлежит конвертации (расширение есть в массиве), серый цвет - не подлежит

function win1251_to_utf8($source, $ext_convert = array(), $exclude = array('file' => array(), 'dir' => array()), $convert = 0, $result = array())
{
    if (!isset($result['source']['dir']))
    {
        $result['source']['dir'] = $source;
        $result['source']['strlen'] = mb_strlen($source);
    }
    if ($paths = array_diff(scandir($source), array('..', '.')))
    {
        foreach($paths as $path)
        {
            if (is_dir($source.'/'.$path))
            {
                // Обработка исключений
                if (!in_array($source.'/'.$path, $exclude['dir']))
                {
                    $result = win1251_to_utf8($source.'/'.$path, $ext_convert, $exclude, $convert, $result);
                }
            }
            else
            {
                if (!in_array($source.'/'.$path, $exclude['file']))
                {
                    // Только файлы с определенными расширениями
                    foreach ($ext_convert AS $key => $ext)
                        $tmp .= '(?:\.'.$ext.')|';
                    $tmp = substr($tmp, 0, -1);
                    $pattern = '~'.$tmp.'$~i';
                    $result['counter_files']++;
                    if (preg_match($pattern, $source.'/'.$path))
                    {
                        $file_content = file_get_contents($source.'/'.$path);

                        // Перекодировка
                        $fs1 = filesize($source.'/'.$path);
                        if ($convert == 1)
                        {
                            // Проверка на доступность файла для записи
                            if (!is_writable($source.'/'.$path))
                            {
                                $result['output_txt'] .= '<div style="color: red;">'.$result['counter_files'].'. Ошибка: '.$source.'/'.$path.' не доступен для записи, конвертация остановлена.</div>';
                                return $result;
                            }
                            $file_content = iconv('windows-1251', 'utf-8', $file_content);
                            file_put_contents($source.'/'.$path, $file_content);
                            $fs2 = filesize($source.'/'.$path);
                            if ($fs1 != $fs2)
                                $result['output_txt'] .= '<div style="color: red;">'.$result['counter_files'].'. Ошибка: '.$source.'/'.$path.' ('.$fs1.' != '.$fs2.')</div>';
                            else
                                $result['output_txt'] .= '<div style="color: green;">'.$result['counter_files'].'. '.$source.'/'.$path.'</div>';
                        }
                        else
                        {
                            if (!is_writable($source.'/'.$path))
                                $result['output_txt'] .= '<div style="color: red;">'.$result['counter_files'].'. Ошибка: '.$source.'/'.$path.' не доступен для записи.</div>';
                            else
                                $result['output_txt'] .= '<div style="">'.$result['counter_files'].'. '.$source.'/'.$path.'</div>';
                        }
                        $result['path']['conv_file_path'][] = $source.'/'.$path;
                    }
                    else
                    {
                        $result['output_txt'] .= '<div style="color: #a0a0a0;">'.$result['counter_files'].'. '.$source.'/'.$path.'</div>';
                    }
                }
            }
        }
    }
    return $result;
}

$source = __DIR__ . '/utf/ssl';
$convert = 0;
$ext_convert = array('php', 'inc', 'html', 'htm');
$exclude_dir = array($source.'/js', $source.'/img'); // Директории, файлы в которых конвертировать не нужно
$exclude_file = array($source.'/!capcha.php'); // файлы, которые конвертировать не нужно
$exclude = array('file' => $exclude_file, 'dir' => $exclude_dir);

$result_func = win1251_to_utf8($source, $ext_convert, $exclude, $convert);

echo '<html>

<head>
  <title>Конвертация файлов</title>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>

<body>
'.$result_func['output_txt'].'
</body>
</html>';

?>

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