Truly
写精彩代码 品暇逸人生

有时候我们要处理各种各样的编码,却经常遇到乱码的情况,这时我们要将文件保存为一种特定的编码,但是如果页面很多的时候就会非常头痛,那么有没有办法通常编程实现文件编码保存的批量处理呢?答案是肯定的。

首先我把对文件转换的代码帖出来
  public void ConvertEncoding(string sourcePath, string destPath, Encoding destEncoding)
  {
   //Author: Truly 2006-3-31 2:24
   Encoding srcEncoding = Encoding.Default;
   FileStream fs = new FileStream(sourcePath, FileMode.Open);
   byte[] inBuff = new byte[fs.Length ];

   if(fs.CanRead)
   {
    //原理: 通过文件前三位确定编码
    Byte[] Bt = new Byte[3];
    fs.Read(Bt, 0, 3);
    if(Bt[0] == 255 && Bt[1] == 254)
     srcEncoding = Encoding.Unicode;
    else if(Bt[0] == 254 && Bt[1] == 255)
     srcEncoding = Encoding.BigEndianUnicode;
    else if(Bt[0] == 239 && Bt[1] == 187 && Bt[2] == 191)
     srcEncoding = Encoding.UTF8;
    else
     srcEncoding = Encoding.Default;
   }

   fs.Seek(0, SeekOrigin.Begin); //返回文件头
   fs.Read(inBuff, 0, (int)fs.Length);
   fs.Close();

   byte[] outBuff = Encoding.Convert(srcEncoding, destEncoding, inBuff, 0, inBuff.Length);
   byte[] markUnicode = {255,254};
   byte[] markBigEndianUnicode = {254,255};
   byte[] markUTF8 = {239,187,191};

   FileStream outFile =  new FileStream(destPath, FileMode.Create);

   // 使用文件流方式写入UTF8编码标记
   if( destEncoding ==  Encoding.Unicode)
    outFile.Write(markUnicode, 0, markUnicode.Length);
   else if( destEncoding ==  Encoding.UTF8 )
    outFile.Write(markUTF8, 0, markUTF8.Length);

   if(destEncoding == Encoding.Default && srcEncoding != destEncoding)
    outFile.Write(outBuff, 1, outBuff.Length-1);
   else
    outFile.Write(outBuff, 0, outBuff.Length);
   outFile.Close();
  }


使用示例:
//无论原来是什么编码均可转换为所需编码文件 :B
   ConvertEncoding("d:\\2.aspx", "d:\\unicode.aspx", Encoding.Unicode );
   ConvertEncoding("d:\\2.aspx", "d:\\utf8.aspx", Encoding.UTF8  );   
   ConvertEncoding("d:\\2.aspx", "d:\\gb2312.aspx", Encoding.Default   );



下面再看一下完整的对某目录下所有.aspx的批量操作

// 将test目录下所有的.aspx文件转换为Unicode编码
   DirectoryInfo di = new DirectoryInfo("d:\\test");
   Process(di);

private void Process(DirectoryInfo   di)
  {
   foreach(FileInfo fi in di.GetFiles("*.aspx"))
   {
    Response.Write(fi.FullName + "<br>");
    ConvertEncoding(fi.FullName, fi.FullName, Encoding.Unicode);
   }

   foreach(DirectoryInfo dic in di.GetDirectories())
   {
    Process(dic);
   }
  }

以上代码经过反复测试,请放心使用!!:B 完整源码可以点击 这里 下载
本人心血所注,转载请注明出处谢谢

posted on 2006-03-31 03:01  Truly  阅读(1442)  评论(0编辑  收藏  举报