php实现文件编码批量转换
有些问题,不能重复转,比如gbk转到utf8,然后有在转成utf8,这样会乱码,我本来试图在转换之前去检测编码的,貌似失败了。我特意试了一个文件,我检测它是是否是gbk或者是utf-8,都返回true。这就不懂了。
复制代码 代码如下:
/**
* 转换文件编码
* 依赖的扩展filesystem 和 mbstring
* @example
*
<br> * include_once 'ConvertEncode.php';<br> * $convert = new ConvertEncode();<br> * try{<br> * $convert->setPath('my', true, true);//目录<br> * //$convert->setPath('my.php');//单文件<br> * $convert->setEncode('GBK', 'UTF-8');<br> * $convert->convert();<br> * }catch(ConvertException $e) {<br> * echo $e->getMessage();<br> * }<br> *
*/
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 {
}

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

PHP是一种广泛应用于服务器端的脚本语言,特别适合web开发。1.PHP可以嵌入HTML,处理HTTP请求和响应,支持多种数据库。2.PHP用于生成动态网页内容,处理表单数据,访问数据库等,具有强大的社区支持和开源资源。3.PHP是解释型语言,执行过程包括词法分析、语法分析、编译和执行。4.PHP可以与MySQL结合用于用户注册系统等高级应用。5.调试PHP时,可使用error_reporting()和var_dump()等函数。6.优化PHP代码可通过缓存机制、优化数据库查询和使用内置函数。7

PHP和Python各有优势,选择应基于项目需求。1.PHP适合web开发,语法简单,执行效率高。2.Python适用于数据科学和机器学习,语法简洁,库丰富。

PHP和Python各有优势,选择依据项目需求。1.PHP适合web开发,尤其快速开发和维护网站。2.Python适用于数据科学、机器学习和人工智能,语法简洁,适合初学者。

PHP在电子商务、内容管理系统和API开发中广泛应用。1)电子商务:用于购物车功能和支付处理。2)内容管理系统:用于动态内容生成和用户管理。3)API开发:用于RESTfulAPI开发和API安全性。通过性能优化和最佳实践,PHP应用的效率和可维护性得以提升。

PHP仍然具有活力,其在现代编程领域中依然占据重要地位。1)PHP的简单易学和强大社区支持使其在Web开发中广泛应用;2)其灵活性和稳定性使其在处理Web表单、数据库操作和文件处理等方面表现出色;3)PHP不断进化和优化,适用于初学者和经验丰富的开发者。

PHP适合web开发,特别是在快速开发和处理动态内容方面表现出色,但不擅长数据科学和企业级应用。与Python相比,PHP在web开发中更具优势,但在数据科学领域不如Python;与Java相比,PHP在企业级应用中表现较差,但在web开发中更灵活;与JavaScript相比,PHP在后端开发中更简洁,但在前端开发中不如JavaScript。

PHP主要是过程式编程,但也支持面向对象编程(OOP);Python支持多种范式,包括OOP、函数式和过程式编程。PHP适合web开发,Python适用于多种应用,如数据分析和机器学习。

PHP和Python各有优劣,选择取决于项目需求和个人偏好。1.PHP适合快速开发和维护大型Web应用。2.Python在数据科学和机器学习领域占据主导地位。
