zoukankan      html  css  js  c++  java
  • 批量编码转化工具(实现文件编码的自动检测)

    先看截图

    工具对.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文件循环引用的话,会导致无线递归,直到堆栈溢出死掉。虽然临时修正好了,但仍然不完善,等完全修正好了,我再重新发资源吧。如果谁有更好的方法,还望不吝赐教,先行谢过。

  • 相关阅读:
    Android安装apk
    Android获取应用程序版本信息
    Handler消息传递机制
    Activity的启动模式
    cocopods的使用
    ios9 的新特性
    静态库的制作详解
    真机调试
    时间差计算(给定两时间,转换为时间差)
    socket 通信机制的实现
  • 原文地址:https://www.cnblogs.com/geeking/p/4031013.html
Copyright © 2011-2022 走看看