php实现文件编码批量转换
2015-01-24信息快讯网
转换文件编码,比如原来是gbk,转换成utf-8的,可以转单个文件也可以转换整个目录的文件,可选是否递归目录
有些问题,不能重复转,比如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版本的cron定时任务执行器使用实例
PHP框架Swoole定时器Timer特性分析
几道坑人的PHP面试题 试试看看你会不会也中招
PHP针对常规模板引擎中与CSS/JSON冲突的解决方法
php解析json数据实例
php与flash as3 socket通信传送文件实现代码
php中将一段数据存到一个txt文件中并显示其内容
PHP解码unicode编码的中文字符代码分享
PHP中读取文件的8种方法和代码实例
两种设置php载入页面时编码的方法
php ci框架中加载css和js文件失败的原因及解决方法
PHP实现把文本中的URL转换为链接的auolink()函数分享
php实现读取超大文件的方法
将CMYK颜色值和RGB颜色相互转换的PHP代码
完美的2个php检测字符串是否是utf-8编码函数分享
CodeIgniter采用config控制的多语言实现根据浏览器语言自动转换功能
PHP中遇到BOM、<feff>编码导致json_decode函数无法解析问题
PHP实现的汉字拼音转换和公历农历转换类及使用示例
解析PHP强制转换类型及远程管理插件的安全隐患
支持生僻字且自动识别utf-8编码的php汉字转拼音类
php实现文件下载简单示例(代码实现文件下载)
php导出word文档与excel电子表格的简单示例代码
php 创建以UNIX时间戳命名的文件夹(示例代码)
PHP_Cooikes不同页面无法传递的解决方法
php function用法如何递归及return和echo区别
详解PHP中strlen和mb_strlen函数的区别
php 生成自动创建文件夹并上传文件的示例代码
php无限遍历文件夹示例分享
关于js和php对url编码的处理方法
设置php页面编码的两种方法示例介绍
php ci框架中加载css和js文件失败的解决方法
php使用多个进程同时控制文件读写示例
php根据操作系统转换文件名大小写的方法
php全角字符转换为半角函数
基于preg_match_all采集后数据处理的一点心得笔记(编码转换和正则匹配)
利用yahoo汇率接口实现实时汇率转换示例 汇率转换器
浅析php数据类型转换
php制作unicode解码工具(unicode编码转换器)代码分享
php使用mb_check_encoding检查字符串在指定的编码里是否有效