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

PHP: Массовая перекодировка файлов из windows-1251 в utf-8 и наоборот

Скрипт массовой перекодировки файлов из UTF-8 в любую кодировку и наоборот из любой кодировки в UTF-8. Перекодируются все файлы с нужными расширениями в папке с декодером и во всех подпапках.

Сохраните файл decoder.php на сервер с поддержкой php в папку с файлами которые вы хотите перекодировать. Все файлы в папке и поддиректориях будут перекодированы в соответствии с параметрами которые вы укажете.

<?php
$FROM = 'windows-1251'; // из какой кодировки конвертировать
$TO = 'utf-8'; // в какую кодировку конвертировать
$EXTENSIONS = array(
 'html', // расширение файлов, с которыми скрипт будет работать
);
$decoder = new CDecoder($FROM, $TO, $EXTENSIONS);

class CDecoder
{
 var $inCharset = '';
 var $outCharset = '';
 var $extenstions = array();

 function needToConvert($str){
  if(preg_match('#.#u', $str) ){
   $utf = true;
  }else{
   $utf = false;
  }

  if($utf == false && stripos($this->outCharset, 'utf') !== false)
  {
   return true;
  }
  elseif($utf == true && stripos($this->outCharset, 'utf') === false)
  {
   return true;
  }

  return false;
 }

 function fileDecode($path){

  if(!is_file($path)){
   print "No such file ".$path." <br />";
   return false;
  }


  $size = filesize($path);
  if($size == 0){
   print "File ".$path." is EMPTY<br />";
   return false;
  }

  $file = fopen($path, 'r+');
  $content = fread($file, $size);

  if($this->needToConvert($content))
  {
   rewind($file);
   ftruncate($file, 0);
   fwrite($file, iconv($this->inCharset, $this->outCharset, $content));

   print "Decoded <span style='font-weight:bold; color:#FF0000;'>".$this->inCharset."</span> to <span style='font-weight:bold; color:#0000FF;'>".$this->outCharset.'</span><br />'.$path.'<br /><br />';
  }else{
   print "File ".$path." already at ".$this->outCharset."<br>";
  }

  fclose($file);
 }

 function getSubDirs($dir){
  if(is_dir($dir)){
   $path = opendir($dir);
   $subDirs = array();
   while(($file = readdir($path)) !== false){
    $filePath = $dir.'/'.$file;
    if($file != '.' && $file != '..' && $filePath != $_SERVER['SCRIPT_FILENAME']){
     $info = pathinfo($filePath);
     if(is_dir($filePath)){
      $subDirs[] = $filePath;
     }elseif(in_array($info["extension"], $this->extensions)){
      $this->fileDecode($filePath);
     }
    }
   }
   closedir($path);
   return $subDirs;
  }
 }

 public function CDecoder($inCharset, $outCharset, $extensions){
  if(!empty($inCharset))
   $this->inCharset = $inCharset;
  else{
   echo "No <span style='color:#F00;'>FROM</span> encoding given.<br>";
   return;
  }

  if(!empty($outCharset))
   $this->outCharset = $outCharset;
  else{
   echo "No <span style='color:#F00;'>TO</span> encoding given.<br>";
   return;
  }

  if(!empty($extensions))
   $this->extensions = $extensions;
  else{
   echo "No file extensions given <br>";
   return;
  }

  $startDir = getcwd();
  $dirs = $this->getSubDirs($startDir);
  while($dirs){
   $subDirs = $this->getSubDirs(reset($dirs));
   $dirs = array_merge($dirs, $subDirs);
   unset($dirs[0]);
   echo '<pre>'; print_r($dirs); echo '</pre><hr />';
  }
  echo "<span style='font-weight:bold; font-size:3em; color:#00FF00;'>All operations done</span>";
 }
}

Запустите скрипт. Для запуска просто откройте его в браузере. Например если адрес сайта domain.com и вы закачали скрипт в папку files, то откройте в браузере адрес http://domain.com/files/decoder.php.