Проблемы при попытке перевести проект в кодировку 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>';
?>