首页 > 代码库 > 批量编码转化工具(实现文件编码的自动检测)

批量编码转化工具(实现文件编码的自动检测)

先看截图

工具对.c,.h,.cpp,.txt文件进行转换,其余类型文件,则仅仅拷贝到转换后的输出路径。这种处理是为了转换前和转换后的项目结构保持不变。

 

工具中一个重要的部分,是对文件编码的自动检测(选项为Auto的情况)

此部分使用了第三方组件(NonCodeNet)

调用代码如下:

public string getFileEncoding(string filePath)        {            string uni = string.Empty;            Stream stream = File.Open(filePath, FileMode.Open, FileAccess.Read);            BinaryReader binReader = new BinaryReader(stream);            byte[] dat = new byte[stream.Length];            binReader.Read(dat, 0, dat.Length);            String cod = objNonCode.GetCodeName(ref dat, false);            uni = changeCode(cod);            binReader.Close();            stream.Close();            return uni;        }
        private string changeCode(string cod)        {            string uni = string.Empty;            switch (cod)            {                case "SJIS":                    uni = "shift-jis";                    break;                case "JIS":                    uni = "iso-2022-jp";                    break;                case "EUC":                    uni = "euc-jp";                    break;                case "UNICODE":                    uni = "utf-16";                    break;                case "UTF7":                    uni = "utf-7";                    break;                case "UTF8":                    uni = "utf-8";                    break;                //case "BIN":                //    uni = "";                //    break;                default:                    uni = "utf-8";                    break;            }            return uni;        }

具体的编码转换部分:

        private void encodeOneFile(string srcFile, string desFile, string strEncode, Encoding toEncode)        {            Encoding encode = Encoding.GetEncoding(strEncode);            FileStream fsSrc = new FileStream(srcFile, FileMode.Open, FileAccess.Read);            StreamReader srSrc = new StreamReader(fsSrc, encode);            FileStream fsDes = new FileStream(desFile, FileMode.Create);                        StreamWriter swDes = new StreamWriter(fsDes, toEncode);            long fileLength = fsSrc.Length;            //8M缓冲区            //byte[] buffer = new byte[8 * 1024 * 1024];            char[] cbuff = new char[8 * 1024 * 1024];            int readLength = srSrc.Read(cbuff, 0, cbuff.Length);            long readCount = 0;            while (readLength > 0)            {                //swDes.Write(buffer, 0, readLength);                swDes.Write(cbuff, 0, readLength);                readCount += readLength;                int percentage = (int)(readCount * 100 / fileLength);                //readLength = srSrc.Read(buffer, 0, buffer.Length);                readLength = srSrc.Read(cbuff, 0, cbuff.Length);            }            srSrc.Close();            fsSrc.Close();            swDes.Close();            fsDes.Close();        }

实现编码转换的思路就是,以A编码打开文件srcPath/test.c,然后以B编码保存desPath/test.c,如此就实现了将文件test.c从A编码转为B编码。

好了,代码就不一一贴了,整个项目我已经打包上传到CSDN了,有需要的可以下载看看。

http://download.csdn.net/detail/geeking/8049169

 

另:上篇博客《c# 简易绘制C语言头文件包含关系图》中的代码存在致命bug,若H文件循环引用的话,会导致无线递归,直到堆栈溢出死掉。虽然临时修正好了,但仍然不完善,等完全修正好了,我再重新发资源吧。如果谁有更好的方法,还望不吝赐教,先行谢过。

批量编码转化工具(实现文件编码的自动检测)