代码文件的编码不统一导致的坑

联想到discuz,ecshop发布一个新版本的系统给大家使用,会提供utf-8,gb2312版本的代码下载。所以肯定是批量转换编码出来的。

这种是转换html文件。

http://blog.csdn.net/iseagold/article/details/5472377

我需要找一个批量转换文件编码的工具才行。

问题在于:目录中混合了gb2312和utf8编码的。如何才能用工具去自动判断呢。

不要强制转换一次编码。

gb2312和utf8编码的。如果是utf8编码的文件,就不要转换,如果是gb2312的编码才执行转换成utf8编码。

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

按照给定的字符集存储文件时,在文件的最开头的三个字节中就有可能存储着编码信息,所以,基本的原理就是只要读出文件前三个字节,判定这些字节的值,就可以得知其编码的格式。其实,如果项目运行的平台就是中文操作系统,如果这些文本文件在项目内产生,即开发人员可以控制文本的编码格式,只要判定两种常见的编码就可以 了:GBK和UTF-8。由于中文Windows默认的编码是GBK,所以一般只要判定UTF-8编码格式。

对于UTF-8编码格式的文本文件,其前3个字节的值就是-17、-69、-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;

}

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;
}

时间: 2024-11-10 10:38:09

代码文件的编码不统一导致的坑的相关文章

读写文件编码方式不一致导致文件乱码的解决方案

这几天在弄一个android应用的数据加密功能,为了避免加密.解密算法被破解,我将加密和解密的核心算法用JNI封装起来,只把接口暴露给java层. 工作流程是这样的: 1.通过自己写的加密解密工具将数据加密: 2.将加密的数据放在android的asserts文件夹下: 3.在首次使用数据时将asserts文件夹下的数据拷贝到一个隐藏文件夹下: 4.解密隐藏文件夹下的文件. 在用加密工具将数据加密好了,在程序解密这个数据文件的过程中,发现解密出来的文件是原来文件大小的2倍,并且全是乱码,跟踪发现

python codecs模块 ---处理数据写入文件时会有编码不统一的问题

我们用open方法打开文件有时候会有一些问题,因为open打开文件只能写入str类型,而不会管字符串是什么编码方式. 示例: >>> fr = open('test.txt','a') >>> line1 = "我爱祖国" >>> fr.write(line1) 有编码不统一的时候,此时写入open方式打开的文件就有问题了. >>> line2 = u'我爱祖国' >>> fr.write(lin

Python文件写入编码问题

今天,用Python写文件,发现中国人真不容易,任何编程问题都需要比老外多学一套应对编码的方法.JSP写完了吗?中文编码问题考虑一下:servlet中的url,转发的文本,都有可能与什么gb2312,isoxxxx,utf-8,unicode,ascii扯上关系.以至于,我们每每遇到运行异常,都会"一朝被蛇咬十年怕井绳"般思考"是不是又是编码导致的". 在python里,编码问题依然是个恶心的问题.之前在VS for Python的IDE环境下,已经饱尝中文编码之苦

关于Apache默认编码错误,导致网站乱码的解决方案

最近经常有同学在使用LAMP/WAMP时,遇到这样的编码错误问题: A网站程序编码UTF-8编码安装成功,运行成功. B网站程序编gb2312也要安装在同一服务器上. 这样就出现问题了,Apache默认编码UTF-8在解析A网站的时候没有任何问题,当运行B网站时出现的"蝌蚪文"乱码问题. 单纯的修改Apache默认编码为gb2312这样就导致A网站出现"蝌蚪文". 问题分析: 如果你在网上搜索 “apache配置”,搜到的页面大多都会建议你在httpd.conf中加

Unicode代码点与编码方式

一.Unicode字符集 UTF编码,全称是Unicode Transformer Format,这种编码是UCS(Universal Mutiple-Octet Doded Character Set,国际标准ISO10646规定的通用字符集)的实际形式,它的分类是按照其基本长度所占用的位数而定,分为UTF-8/16/32三种形式.UTF可以说是其他字符集的集合,它使得其它字符集是交叉兼容的,可以说,凡是将文字符号转为UCS后再转回原来的编码,也不会丢失信息.UCS包含了现在所有的已知语言的字

用java修改文件的编码

1.将本地的文件转换成另外一种编码输出,主要逻辑代码如下: 1 /** 2 * 将本地文件以哪种编码输出 3 * @param inputfile 输入文件的路径 4 * @param outfile 输出文件的路径 5 * @param code 输出文件的编码 6 * @throws IOException 7 */ 8 public void convert(String inputfile,String outfile,String code) throws IOException {

PHP、MySQL、浏览器编码不统一的情况下如何保证正常解析?

最理想的情况是,把三者编码都统一成gbk或者utf-8,这样解析就一切正常.但如何不统一呢? 比如: --PHP的编码是utf-8 --MySQL的编码是utf-8 --浏览器的编码是gbk 这时,只要考虑PHP和浏览器之间即可,因为PHP和MySQL的编码是一致的,可以不考虑.而如何告诉浏览器,PHP返回给浏览器的东西是用utf-8,请用utf-8解析? 答案: (1)方法之一就是我们在PHP中用的那个header函数.header("Content-type:text/html;charse

SNF快速开发平台3.0之--文件批量上传-统一附件管理器-在线预览文件(有互联网和没有两种)

实际上在SNF里使用附件管理是非常简单的事情,一句代码就可以搞定.但我也要在这里记录一下统一附件管理器能满足的需求. 通用的附件管理,不要重复开发,调用尽量简洁. 批量文件上传,并对每个文件大小限制,客户端无刷新 可以对已经上传的附件进行名字变更,改成更友好的名称. 可以对已经上传的文件进行删除. 并记录文件大小,上传人.时间和修改人和时间等. 可以下载附件到本地电脑. 文件的在线预览,支持不安装office软件就可以预览(不管是图片还是office文档都得支持预览) 虽然比专业的图文档管理系统

如何用CSC.exe来编译Visual C#的代码文件

原文:如何用CSC.exe来编译Visual C#的代码文件 C#的编译过程? ? ? 如何用CSC.exe来编译Visual C#的代码文件 ? Csc.exe 编译器的位置路径:C:\Windows\Microsoft.NET\Framework64\v4.0.30319 如何编译: 1.为了使用方便,你可以手动把上面的目录添加到Path环境变量中去 2.用Csc.exe编译HelloWorld.cs非常简单,打开命令提示符,并切换到存放 HelloWorld.cs文件的目录中,输入下列行命