当前位置:首页 > PHP教程 > php高级应用 > 列表

php实现文件编码批量转换

发布:smiling 来源: PHP粉丝网  添加日期:2020-10-20 10:31:28 浏览: 评论:0 

转换文件编码,比如原来是gbk,转换成utf-8的,可以转单个文件也可以转换整个目录的文件,可选是否递归目录。

有些问题,不能重复转,比如gbk转到utf8,然后有在转成utf8,这样会乱码,我本来试图在转换之前去检测编码的,貌似失败了。我特意试了一个文件,我检测它是是否是gbk或者是utf-8,都返回true。这就不懂了,代码如下:

  1. <?php 
  2. /** 
  3.  * 转换文件编码 
  4.  * 依赖的扩展filesystem 和 mbstring 
  5.  * @example 
  6.  * <pre> 
  7.  * include_once 'ConvertEncode.php'; 
  8.  * $convert = new ConvertEncode(); 
  9.  * try{ 
  10.  *   $convert->setPath('my', true, true);//目录 
  11.  *    //$convert->setPath('my.php');//单文件 
  12.  *   $convert->setEncode('GBK', 'UTF-8'); 
  13.  *   $convert->convert(); 
  14.  * }catch(ConvertException $e) { 
  15.  *   echo $e->getMessage(); 
  16.  * } 
  17.  * </pre> 
  18.  */ 
  19. class ConvertEncode { 
  20.  
  21.  /** 
  22.   * 要转换成的编码 
  23.   * @var string 
  24.   */ 
  25.  private $_to_encoding
  26.  
  27.  /** 
  28.   * 转换前的编码 
  29.   * @var string 
  30.   */ 
  31.  private $_from_encoding
  32.  
  33.  /** 
  34.   * 要转换的的目录或者单文件 
  35.   * @var string 
  36.   */ 
  37.  private $_path
  38.  
  39.  /** 
  40.   * 是否是一个目录,当给出的是目录是才设置 
  41.   * @var boolean 
  42.   */ 
  43.  private $_directory
  44.  
  45.  /** 
  46.   * 是否递归遍历,仅对目录有效 
  47.   * @var boolean 
  48.   */ 
  49.  private $_recursion
  50.  
  51.  /** 
  52.   * 保存所有待转换的文件,仅当转换目录里面的文件时才用 
  53.   * @var array 
  54.   */ 
  55.  private $_files = array(); 
  56.  
  57.  /** 
  58.   * 构造函数 
  59.   */ 
  60.  public function __construct() { 
  61.   if( ! function_exists('mb_convert_encoding') ) { 
  62.    throw new ConvertException('mbstring extension be required'); 
  63.   } 
  64.  } 
  65.  
  66.  /** 
  67.   * 设置需要转换的目录或者单文件 
  68.   * @param string $path 目录或者文件 
  69.   * @param boolean 是否是目录 
  70.   * @param boolean 是否递归目录 
  71.   * @return boolean 
  72.   */ 
  73.  public function setPath($path$is_dir = false, $rec = false) { 
  74.   $this->_path = $path
  75.   $this->_directory = $is_dir
  76.   $this->_recursion = $rec
  77.   return true; 
  78.  } 
  79.  
  80.  /** 
  81.   * 设置转换前的编码和要转换到的编码 
  82.   * @param string $encode 转换前的编码 
  83.   * @param string $encode 转换到的编码 
  84.   * @return boolean 
  85.   */ 
  86.  public function setEncode($encode_from$encode_to) { 
  87.   $this->_from_encoding = $encode_from
  88.   $this->_to_encoding   = $encode_to
  89.   return true; 
  90.  } 
  91.  
  92.  /** 
  93.   * 转换编码,根据是否是目录的设置分别转换 
  94.   * @return boolean 
  95.   */ 
  96.  public function convert() { 
  97.   if($this->_directory ) { 
  98.    return $this->_convertDirectory(); 
  99.   } 
  100.   return $this->_convertFile(); 
  101.  } 
  102.  
  103.  /** 
  104.   * 转换文件 
  105.   * @throws ConvertException 
  106.   * @return boolean 
  107.   */ 
  108.  private function _convertFile() { 
  109.   if( ! file_exists($this->_path) ) { 
  110.    $message = $this->_path . ' does not exist.'
  111.    throw new ConvertException($message); 
  112.   } 
  113.   if( ! is_file($this->_path) ) { 
  114.    $message = $this->_path . ' is not a file.'
  115.    throw new ConvertException($message); 
  116.   } 
  117.   if( ! $this->_isWR() ) { 
  118.    $message = $this->_path . ' must can be read and write.'
  119.    throw new ConvertException($message); 
  120.   } 
  121.   $file_real_path    = realpath($this->_path); 
  122.   $file_content_from = file_get_contents$file_real_path ); 
  123.   if( mb_check_encoding($file_content_from$this->_from_encoding) ) { 
  124.    $file_content_to   = mb_convert_encoding( $file_content_from$this->_to_encoding, $this->_from_encoding ); 
  125.    file_put_contents$file_real_path$file_content_to ); 
  126.   } 
  127.   return true; 
  128.  
  129.  } 
  130.  
  131.  /** 
  132.   * 转换目录 
  133.   * @throws ConvertException 
  134.   * @return boolean 
  135.   */ 
  136.  private function _convertDirectory() { 
  137.   if( ! file_exists($this->_path) ) { 
  138.    $message = $this->_path . ' does not exist.'
  139.    throw new ConvertException($message); 
  140.   } 
  141.   if( ! is_dir($this->_path) ) { 
  142.    $message = $this->_path . ' is not a directory.'
  143.    throw new ConvertException($message); 
  144.   } 
  145.   if( ! $this->_isWR() ) { 
  146.    $message = $this->_path . ' must can be read and write.'
  147.    throw new ConvertException($message); 
  148.   } 
  149.   $this->_scanDirFiles(); 
  150.   ifemptyempty($this->_files) ) { 
  151.    $message = $this->_path . ' is a empty directory.'
  152.    throw new ConvertException($message); 
  153.   } 
  154.   foreach$this->_files as $value ) { 
  155.    $file_content_from = file_get_contents$value ); 
  156.    if( mb_check_encoding($file_content_from$this->_from_encoding) ) { 
  157.     $file_content_to   = mb_convert_encoding( $file_content_from$this->_to_encoding, $this->_from_encoding ); 
  158.     file_put_contents$value$file_content_to ); 
  159.    } 
  160.   } 
  161.   return true; 
  162.  } 
  163.  
  164.  /** 
  165.   * 判断文件或者目录是否可读写 
  166.   * @return boolean 可读写时返回true,否则返回false 
  167.   */ 
  168.  private function _isWR() { 
  169.   ifis_readable($this->_path) && is_writable($this->_path) ) { 
  170.    return true; 
  171.   } 
  172.   return false; 
  173.  } 
  174.  
  175.  /** 
  176.   * 遍历目录,找出所有文件,加上绝对路径 
  177.   * @return boolean 
  178.   */ 
  179.  private function _scanDirFiles($dir = '') { 
  180.   $base_path = emptyempty$dir ) ? realpath($this->_path) . DIRECTORY_SEPARATOR : realpath($dir) . DIRECTORY_SEPARATOR; 
  181.   $files_tmp = emptyempty$dir ) ? scandir($this->_path) : scandir($dir); 
  182.   foreach$files_tmp as $value ) { 
  183.    if$value == '.' || $value == '..' || ( strpos($value'.') === 0 ) ) { 
  184.     continue
  185.    } 
  186.    $value = $base_path . $value
  187.    ifis_dir($value) ) { 
  188.     if$this->_recursion ) { 
  189.      $this->_scanDirFiles($value); 
  190.     } 
  191.    } 
  192.    elseifis_file($value) ) { 
  193.     $this->_files[] = $value
  194.    } 
  195.   } 
  196.   return true; 
  197.  }//phpfensi.com 
  198.  
  199. /** 
  200.  * 转换异常 
  201.  * 
  202.  */ 
  203. class ConvertException extends Exception { 
  204.  

Tags: php批量转换

分享到: