PHP更改文件编码应该算是比较简单的事情,在使用uchome项目(UTF-8)的时候,发现程序的编码好奇怪,有ANSI的,和UTF-8的。
很妖的是,我在ubuntu下面打开这些ansi的文件时,由于文件中含 有中文,结果全显示乱码,编码还显示为latin1。然后拷到另外一个目录,编码显示就正常了,为CP936。
由于编辑器没有批量转换功能,固此,只能使用PHP自带的功能了。。。(关键我也不会其他语言)
由于转换的时候会需要判断一下编码,如果编码本身是UTF-8的,再使用mb_convert_encoding($data,'utf-8','gbk'),反而会导致乱码。。
所以。。。就有了以下程序
慎重申明:Dir类的rmdir有BUG,请勿使用。。。。写的时候,我没有考虑太多,如果设定了某个目录,最终是会把这个目录也会删除的,而与我事先想的。把该目录下的内容清空有误差。(当然也可以在删除后重建,但毕竟不是原来的权限了。)

代码如下:

<?php

$dirName = "./uchome";

$files = Dirs::read( $dirName , true);

foreach( $files as $fileName )
{
if( is_file( $fileName ) && in_array(Files::extension( $fileName ) , array('php','html','htm'))){
$fileData = Files::read( $fileName );
$fileType = mb_detect_encoding($fileData , array('UTF-8','GBK','LATIN1','BIG5')) ;
if( $fileType == 'CP936'){
$fileData = mb_convert_encoding($fileData ,'utf-8' , 'gbk');
if( Files::save( $fileName , $fileData )){
echo "{$fileName} convert successed";
echo "<br />";
}
}
}
}



//dir
class Dirs
{
static function read ( $dirname , $recursive = false)
{
static $allInfo;
$dirname .= subStr( $dirname, -1 ) == "/" ? "" : "/";
$dirInfo = glob( $dirname . "*" );
if ( $recursive == false ){
return $dirInfo;
}else{
foreach ( $dirInfo as $info ){
if ( is_dir( $info ) ){
if ( !is_readable( $info ) ){
chmod( $info, 0777 );
}
//$allInfo['dirs'][] = $info;
$allInfo[] = $info;
self::read( $info , true);
}else{
//$allInfo['files'][] = $info ;
$allInfo[] = $info;
}
}
}
return $allInfo;
}

static function rmdir ( $dirname )
{
if ( is_dir( $dirname ) && !is_writeable( $dirname ) ){
if ( !chmod( $dirname , 0666 ) ){
return false;
}
}else if ( !is_dir( $dirname ) ){
return false;
}
$dirname .= subStr( $dirname, -1 ) == "/" ? "" : "/";
$dirInfo = glob( $dirname . "*" );
foreach ( $dirInfo as $info ){
if ( is_dir( $info ) ){
self::rmdir( $info );
}else{
unlink( $info );
}
}
@rmdir( $dirname );
}

function mkdir($dir, $mode = 0777)
{
if (!is_dir($dir)){
$ret = @mkdir($dir, $mode, true);
if (!$ret){
exit('function:mkdirs failed');
}
}
return true;
}
}
//file
class Files
{
static function read ( $filename )
{
if ( !is_readable( $filename ) ){
chmod( $filename, 0644 );
}
return file_get_contents( $filename );
}

static function create ( $filename , $mod = 0666 )
{
if ( @touch( $filename ) == false){
$fp = fopen( $filename, "a+" );
if ( $fp ){
fclose( $fp );
}
}
chmod( $filename, 0666 );
}

static function save ( $filename , $data , $append = false)
{
if ( !file_exists( $filename ) ){
self::create($filename);
$append = false;
}
if ( $append == false ){
return file_put_contents( $filename , $data );
}else{
if ( !is_writeable( $filename ) ){
chmod( $filename, 0666 );
}
return file_put_contents( $filename , $data , FILE_APPEND );
}
}

static function delete ( $filename )
{
if ( !is_array( $filename ) ){
$filenames = array($filename);
}
foreach ( $filenames as $filename ){
if ( is_file( $filename ) ){
if( !unlink( $filename ) ){
chmod( $filename , 0666 );
unlink( $filename );
}
}
}
}

static function extension( $filename ){
return strtolower(pathinfo( $filename , PATHINFO_EXTENSION ));
}
}