代碼文件的編碼不統一致使的坑

 

 

 

聯想到discuz,ecshop發佈一個新版本的系統給你們使用,會提供utf-8,gb2312版本的代碼下載。因此確定是批量轉換編碼出來的。php

 

 

這種是轉換html文件。html

 

http://blog.csdn.net/iseagold/article/details/5472377瀏覽器

 

我須要找一個批量轉換文件編碼的工具才行。ide

 

 

問題在於:目錄中混合了gb2312和utf8編碼的。如何才能用工具去自動判斷呢。函數

不要強制轉換一次編碼。工具

gb2312和utf8編碼的。若是是utf8編碼的文件,就不要轉換,若是是gb2312的編碼才執行轉換成utf8編碼。ui

 

 

http://blog.csdn.net/liu_qiqi/article/details/38706497編碼

 

按照給定的字符集存儲文件時,在文件的最開頭的三個字節中就有可能存儲着編碼信息,因此, 基本的原理就是隻要讀出文件前三個字節,斷定這些字節的值,就能夠得知其編碼的格式。其實,若是項目運行的平臺就是中文操做系統, 若是這些文本文件在項目內產生,即開發人員能夠控制文本的編碼格式,只要斷定兩種常見的編碼就能夠 了:GBK和UTF-8。因爲中文Windows默認的編碼是GBK,因此通常只要斷定UTF-8編碼格式。
   對於UTF-8編碼格式的文本文件, 其前3個字節的值就是-1七、-6九、-65,因此,斷定是不是UTF-8編碼格式的代碼片斷以下:
 
 
 
 
 
 
 
 
 
 
 
 

php的mb_detect_encoding函數,我正準備試一試:

function characet($data){

  if( !empty($data) ){   

    $filetype = mb_detect_encoding($data , array('utf-8','gbk','latin1','big5')) ;  

    if( $filetype != 'utf-8'){  

      $data = mb_convert_encoding($data ,'utf-8' , $filetype);  

    }  

  }  

  return $data;   

}spa

 

 
 
 
 http://blog.csdn.net/wydycrtd/article/details/4793124
 
 
有人也說了,

從新認識一下此問題,當時版主回覆的時候我就以爲mb函數裏必定有這樣的功能,但今日研究了mb庫,並無這樣的功能。用mb_detect_encoding老是不許確。
 
 
 
mbstring 當前實現瞭如下編碼檢測篩選器。 若有如下編碼列表的無效字節序列,編碼的檢測將會失敗。

UTF-8, UTF-7, ASCII, EUC-JP,SJIS, eucJP-win, SJIS-win, JIS, ISO-2022-JP


 var_dump(mb_detect_encoding($str,array('UTF-8','GB2312')));
 
 
 
 
EUC-CN EUC-CN是GB2312最經常使用的表示方法。瀏覽器編碼表上的「GB2312」,一般都是指「 EUC-CN」表示法。
 
php中用mb_detect_encoding測出來的euc-cn是gb2312編碼:EUC-CN是GB2312最經常使用的表示方法
 
 
 
GB 2312字元使用兩個字節來表示。

「第一位 字節」使用0xA1-0xFE
「第二位字節」使用0xA1-0xFE
 
 
網上找到的不能解決自動檢測編碼的問題,這裏我根據本身須要。檢測兩種編碼就能夠了:gb2312和utf-8
<?php

header("Content-type: text/html; charset=utf-8");

/*
 * +---------------------------------------------------
 *  遍歷指定目錄,造成一個目錄句柄返回
 * +---------------------------------------------------
 *
 * +---------------------------------------------------
 */

function explorer_dir($sDir) {

    static $aTempArr = array();

    $dp = opendir($sDir);

    while ($sFileName = readdir($dp)) {
        if ($sFileName != '.' && $sFileName != '..') {
            $sPath = $sDir . "/" . $sFileName;
            if (is_dir($sPath)) {
                explorer_dir($sPath);
            } else {
//                $filetime=date("Y-m-d H:i:s",filectime("$path"));
//                $fp=$path.",".$filetime;
                $fp = $sPath;
                $aTempArr[] = $fp;
            }
        }
    }
    closedir($dp);
    return $aTempArr;
}
/*
 * +----------------------------------------------------------------------
 * //搜索指定目錄下的gb2312編碼文件,轉換成utf-8編碼文件
 * +----------------------------------------------------------------------
 */
function change_gb2312_to_utf8_dir($dir) {

    $all_dirs = explorer_dir($dir);
    $suffix_list = array('php', 'htm', 'html', 'txt', 'js');
    echo 'get files count:';
    echo count($all_dirs) . '<br />';
    $i = 0;
    foreach ($all_dirs as $dir_key => $file_path) {

        $file_content = file_get_contents($file_path);
        $i++;
       echo $i . '、' . $file_path.'<br />';
        var_dump($file_encode_type = mb_detect_encoding($file_content, array('UTF-8', 'EUC-CN'), true)); //EUC-CN是gb2312的另外稱呼,php這個擴展返回的是值,不是gb2312
        echo '<br />';

        //獲取文件的後綴,指定文件類型採起作操做,好比圖片就不能去修改的
        $file_name = basename($file_path);
        $suffix = get_file_suffix($file_name);
        if (in_array($suffix, $suffix_list)) {
            if ($file_encode_type == 'EUC-CN') {
                echo '<font color="red">had changed the file from ' . $file_encode_type . '(gb2312) to UTF-8:' . $file_path . '</font><br /><br />';
                //就是gb2312編碼的
                $after_change_encode_content = iconv("gb2312", "UTF-8", $file_content);
                unlink($file_path);
                file_put_contents($file_path, $after_change_encode_content);
                unset($after_change_encode_content);
            }
        } else {

            echo '<font color="red">the file not in allow file type:' . $file_path . '</font><br /><br />';
        }
        unset($file_content);
        echo '--------------------------------------------------------------------<br /><br />';
    }
}



/*
 * +----------------------------------------------------------------------
 * //搜索指定目錄下指定編碼的文件,目的就是幫助咱們看出本身的項目哪些是什麼編碼的文件
 * +----------------------------------------------------------------------
 */
function dir_file_encode_list($dir) {



    $all_dirs = explorer_dir($dir);

    echo 'get files count:';
    echo count($all_dirs) . '<br />';
    $i = 0;
    foreach ($all_dirs as $dir_key => $file_path) {

        $file_content = file_get_contents($file_path);
        $i++;
        echo $i . '、' . $file_path.'<br />';
        var_dump($file_encode_type = mb_detect_encoding($file_content, array('UTF-8', 'EUC-CN'), true)); //EUC-CN是gb2312的另外稱呼,php這個擴展返回的是值,不是gb2312
        echo '<br />';
        unset($file_content);

        echo '--------------------------------------------------------------------<br /><br />';
    }
}
/*
 * +----------------------------------------------------------------------
 * 掃描指定目錄下的指定目錄下的html文件,批量將裏面的
 * <meta http-equiv="Content-Type" content="text/html; charset=gbk" />
 * 指定的編碼替換成另一個編碼
 * +----------------------------------------------------------------------
 */
function replace_html_charset($dir) {

    $all_dirs = explorer_dir($dir);
    $suffix_list = array('htm', 'html','php');
    echo 'get files count:';
    echo count($all_dirs) . '<br />';
    $i = 0;
    $charset = '<meta http-equiv="Content-Type" content="text/html; charset=gbk" />';
    $to_charset = '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />';
    foreach ($all_dirs as $dir_key => $file_path) {

        $file_content = file_get_contents($file_path);
        $i++;
        echo $i . '、' . $file_path.'<br />';
        //獲取文件的後綴,指定文件類型採起作操做,好比圖片就不能去修改的
        $file_name = basename($file_path);
        $suffix = get_file_suffix($file_name);
        if (in_array($suffix, $suffix_list)) {
            $patten = '%' . $charset . '%i';
       
            if (preg_match($patten, $file_content)) {
                $after_change_encode_content = str_ireplace($charset, $to_charset, $file_content);
                unlink($file_path);
                file_put_contents($file_path, $after_change_encode_content);
                unset($after_change_encode_content);
                echo 'find limit :' . $file_path . '<br /><br />';
            }
        }else{
             echo '<font color="red">the file not in allow file type:' . $file_path . '</font><br /><br />';
        }
    }
}

//dir_file_encode_list("D:\\static\\develop\\mama\\test_change_encode");


//change_gb2312_to_utf8_dir("D:\\static\\develop\\mama\\test_change_encode");


//replace_html_charset("D:\\static\\develop\\mama\\test_change_encode");



function get_file_suffix($file_name){

    $file_name_arr = explode(".", $file_name);
        $suffix = array_pop($file_name_arr);

        return $suffix;
}
View Code
 
相關文章
相關標籤/搜索