php实现文件编码批量转换


Posted in PHP onMarch 10, 2014

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

<?php
/**
 * 转换文件编码
 * 依赖的扩展filesystem 和 mbstring
 * @example
 * <pre>
 * include_once 'ConvertEncode.php';
 * $convert = new ConvertEncode();
 * try{
 *   $convert->setPath('my', true, true);//目录
 *    //$convert->setPath('my.php');//单文件
 *   $convert->setEncode('GBK', 'UTF-8');
 *   $convert->convert();
 * }catch(ConvertException $e) {
 *   echo $e->getMessage();
 * }
 * </pre>
 */
class ConvertEncode { /**
  * 要转换成的编码
  * @var string
  */
 private $_to_encoding;
 /**
  * 转换前的编码
  * @var string
  */
 private $_from_encoding;
 /**
  * 要转换的的目录或者单文件
  * @var string
  */
 private $_path;
 /**
  * 是否是一个目录,当给出的是目录是才设置
  * @var boolean
  */
 private $_directory;
 /**
  * 是否递归遍历,仅对目录有效
  * @var boolean
  */
 private $_recursion;
 /**
  * 保存所有待转换的文件,仅当转换目录里面的文件时才用
  * @var array
  */
 private $_files = array();
 /**
  * 构造函数
  */
 public function __construct() {
  if( ! function_exists('mb_convert_encoding') ) {
   throw new ConvertException('mbstring extension be required');
  }
 }
 /**
  * 设置需要转换的目录或者单文件
  * @param string $path 目录或者文件
  * @param boolean 是否是目录
  * @param boolean 是否递归目录
  * @return boolean
  */
 public function setPath($path, $is_dir = false, $rec = false) {
  $this->_path = $path;
  $this->_directory = $is_dir;
  $this->_recursion = $rec;
  return true;
 }
 /**
  * 设置转换前的编码和要转换到的编码
  * @param string $encode 转换前的编码
  * @param string $encode 转换到的编码
  * @return boolean
  */
 public function setEncode($encode_from, $encode_to) {
  $this->_from_encoding = $encode_from;
  $this->_to_encoding   = $encode_to;
  return true;
 }
 /**
  * 转换编码,根据是否是目录的设置分别转换
  * @return boolean
  */
 public function convert() {
  if($this->_directory ) {
   return $this->_convertDirectory();
  }
  return $this->_convertFile();
 }
 /**
  * 转换文件
  * @throws ConvertException
  * @return boolean
  */
 private function _convertFile() {
  if( ! file_exists($this->_path) ) {
   $message = $this->_path . ' does not exist.';
   throw new ConvertException($message);
  }
  if( ! is_file($this->_path) ) {
   $message = $this->_path . ' is not a file.';
   throw new ConvertException($message);
  }
  if( ! $this->_isWR() ) {
   $message = $this->_path . ' must can be read and write.';
   throw new ConvertException($message);
  }
  $file_real_path    = realpath($this->_path);
  $file_content_from = file_get_contents( $file_real_path );
  if( mb_check_encoding($file_content_from, $this->_from_encoding) ) {
   $file_content_to   = mb_convert_encoding( $file_content_from, $this->_to_encoding, $this->_from_encoding );
   file_put_contents( $file_real_path, $file_content_to );
  }
  return true;
 }
 /**
  * 转换目录
  * @throws ConvertException
  * @return boolean
  */
 private function _convertDirectory() {
  if( ! file_exists($this->_path) ) {
   $message = $this->_path . ' does not exist.';
   throw new ConvertException($message);
  }
  if( ! is_dir($this->_path) ) {
   $message = $this->_path . ' is not a directory.';
   throw new ConvertException($message);
  }
  if( ! $this->_isWR() ) {
   $message = $this->_path . ' must can be read and write.';
   throw new ConvertException($message);
  }
  $this->_scanDirFiles();
  if( empty($this->_files) ) {
   $message = $this->_path . ' is a empty directory.';
   throw new ConvertException($message);
  }
  foreach( $this->_files as $value ) {
   $file_content_from = file_get_contents( $value );
   if( mb_check_encoding($file_content_from, $this->_from_encoding) ) {
    $file_content_to   = mb_convert_encoding( $file_content_from, $this->_to_encoding, $this->_from_encoding );
    file_put_contents( $value, $file_content_to );
   }
  }
  return true;
 }
 /**
  * 判断文件或者目录是否可读写
  * @return boolean 可读写时返回true,否则返回false
  */
 private function _isWR() {
  if( is_readable($this->_path) && is_writable($this->_path) ) {
   return true;
  }
  return false;
 }
 /**
  * 遍历目录,找出所有文件,加上绝对路径
  * @return boolean
  */
 private function _scanDirFiles($dir = '') {
  $base_path = empty( $dir ) ? realpath($this->_path) . DIRECTORY_SEPARATOR : realpath($dir) . DIRECTORY_SEPARATOR;
  $files_tmp = empty( $dir ) ? scandir($this->_path) : scandir($dir);
  foreach( $files_tmp as $value ) {
   if( $value == '.' || $value == '..' || ( strpos($value, '.') === 0 ) ) {
    continue;
   }
   $value = $base_path . $value;
   if( is_dir($value) ) {
    if( $this->_recursion ) {
     $this->_scanDirFiles($value);
    }
   }
   elseif( is_file($value) ) {
    $this->_files[] = $value;
   }
  }
  return true;
 }
}

/**
 * 转换异常
 *
 */
class ConvertException extends Exception {
}
PHP 相关文章推荐
无数据库的详细域名查询程序PHP版(2)
Oct 09 PHP
Optimizer与Debugger兼容性问题的解决方法
Dec 01 PHP
PHP 地址栏信息的获取代码
Jan 07 PHP
php strtotime 函数UNIX时间戳
Jan 14 PHP
PHP 简单数组排序实现代码
Aug 05 PHP
php 连接mssql数据库 初学php笔记
Mar 01 PHP
php设置session值和cookies的学习示例
Mar 21 PHP
50个PHP程序性能优化的方法
Jun 02 PHP
PHP开发框架Laravel数据库操作方法总结
Sep 03 PHP
PHP callback函数使用方法和注意事项
Jan 23 PHP
原生JS实现Ajax通过GET方式与PHP进行交互操作示例
May 12 PHP
php压缩文件夹最新版
Jul 18 PHP
php导出word文档与excel电子表格的简单示例代码
Mar 08 #PHP
php 创建以UNIX时间戳命名的文件夹(示例代码)
Mar 08 #PHP
PHP_Cooikes不同页面无法传递的解决方法
Mar 07 #PHP
php function用法如何递归及return和echo区别
Mar 07 #PHP
详解PHP中strlen和mb_strlen函数的区别
Mar 07 #PHP
解决Codeigniter不能上传rar和zip压缩包问题
Mar 07 #PHP
php 生成自动创建文件夹并上传文件的示例代码
Mar 07 #PHP
You might like
全国FM电台频率大全 - 5 内蒙古自治区
2020/03/11 无线电
php 调用远程url的六种方法小结
2009/11/02 PHP
PHP实现获取某个月份周次信息的方法
2015/08/11 PHP
完美解决thinkphp唯一索引重复时出错的问题
2017/03/31 PHP
Laravel基础_关于view共享数据的示例讲解
2019/10/14 PHP
javascript中对对层的控制
2006/12/29 Javascript
jQuery生成asp.net服务器控件的代码
2010/02/04 Javascript
JQuery将文本转化成JSON对象需要注意的问题
2011/05/09 Javascript
CheckBoxList多选样式jquery、C#获取选择项
2013/09/06 Javascript
JavaScript简单判断复选框是否选中及取出值的方法
2015/08/13 Javascript
javascript设计简单的秒表计时器
2020/09/05 Javascript
jQuery EasyUi实战教程之布局篇
2016/01/26 Javascript
第七章之菜单按钮图标组件
2016/04/25 Javascript
解析JavaScript中的字符串类型与字符编码支持
2016/06/24 Javascript
详解用原生JavaScript实现jQuery的某些简单功能
2016/12/19 Javascript
vue实现表格数据的增删改查
2017/07/10 Javascript
node.js中http模块和url模块的简单介绍
2017/10/06 Javascript
解决在vue项目中webpack打包后字体不生效的问题
2018/09/01 Javascript
通过实例解析js简易模块加载器
2019/06/17 Javascript
javascript 易错知识点实例小结
2020/04/25 Javascript
解决vue项目中某一页面不想引用公共组件app.vue的问题
2020/08/14 Javascript
python模拟Django框架实例
2016/05/17 Python
Python缩进和冒号详解
2016/06/01 Python
python使用Flask操作mysql实现登录功能
2018/05/14 Python
python tkinter canvas 显示图片的示例
2019/06/13 Python
python将类似json的数据存储到MySQL中的实例
2019/07/12 Python
Python实现将蓝底照片转化为白底照片功能完整实例
2019/12/13 Python
python实现图片,视频人脸识别(opencv版)
2020/11/18 Python
ebookers英国:隶属全球最大的在线旅游公司Expedia
2017/12/28 全球购物
澳大利亚家具和家居用品购物网站:Zanui
2018/12/29 全球购物
员工自我鉴定
2013/10/09 职场文书
家庭教育的心得体会
2014/09/01 职场文书
大学生党员自我批评思想汇报
2014/10/10 职场文书
西湖英语导游词
2015/02/06 职场文书
2015年征兵工作总结
2015/07/23 职场文书
【DOTA2】半决赛强强对话~ PSG LGD vs EHOME - DPC 2022 CN REGIONAL FINALS WINTER
2022/04/02 DOTA