Справочники, инструменты, документация

PHP: Как удалить BOM из файла UTF

Для массовой очистки от BOM достаточно загрузить файл с эти скриптом в корневую директорию и запустить.

Различий между UTF-8 и UTF-8 без BOM никаких нет, кроме наличия или отсутствия маркера. Кодировка одна и та же - utf-8. По стандарту unicode маркер должен быть. Удалять маркер BOM при сохранении нужно только для PHP, который почему-то не умеет корректно обрабатывать нормальные unicode файлы.

<?
$HOME = dirname(__FILE__); // Указываем папку с которой начать рекурсивный поиск
$WIN = 0; // Если север на windows, то указать 1

// Рекурсивный поиск
function RecursiveFolder($sHOME)
{
 global $BOMBED, $WIN;
 $win32 = ($WIN == 1) ? "\\" : "/"; // отображение \
 $folder = dir($sHOME);
 $foundfolders = array();
 while ($file = $folder->read()) {
   if ($file != "." and $file != "..") {
     if (filetype($sHOME . $win32 . $file) == "dir") {
       $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
     } else {
       $content = file_get_contents($sHOME . $win32 . $file);
       $BOM = SearchBOM($content);
       if ($BOM) {
         $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
         // Удаляет 3 символа из начала файла
         $content = substr($content, 3);
         // Результат записывает в исходный файл
         file_put_contents($sHOME . $win32 . $file, $content);
       }
     }
   }
 }
 $folder->close();
 if (count($foundfolders) > 0) {
   foreach ($foundfolders as $folder) {
     RecursiveFolder($folder, $win32);
   }
 }
}

// Поиск BOM в файле
function SearchBOM($string)
{
  if (substr($string, 0, 3) == pack("CCC", 0xef, 0xbb, 0xbf)) return true;
  return false;
}
?>


<!DOCTYPE html>
<html lang="ru">
<head>
  <meta charset="utf-8">
  <title>Поиск и удаление UTF8 BOM</title>
</head>
<body>
<div class="FOUND">
  <?
  $BOMBED = array();
  RecursiveFolder($HOME);
  $list = '';
  foreach ($BOMBED as $utf) {
    $list .= $utf . "<br />\n";
  }
  if (!empty($list)) {
    ?>
    <h2>BOM был найден в:</h2>
    <?= $list; ?>
  <? } else { ?>
    <h2>BOM не найден</h2>
  <? } ?>
</div>
</body>
</html>