您的位置:首页 > 其它

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

2014-10-17 14:16 555 查看
先看截图



工具对.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文件循环引用的话,会导致无线递归,直到堆栈溢出死掉。虽然临时修正好了,但仍然不完善,等完全修正好了,我再重新发资源吧。如果谁有更好的方法,还望不吝赐教,先行谢过。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: