读txt文件,中文乱码问题


// // // // // //
using System;
using System.Text;
using System.IO;

 /// <summary>
 /// 用于取得一个文本文件的编码方式(Encoding)。
 /// </summary>

 public class TxtFileEncoding
 {
  public TxtFileEncoding()
  {
  }

  /// <summary>
  /// 取得一个文本文件的编码方式。如果无法在文件头部找到有效的前导符,Encoding.Default将被返回。
  /// </summary>
  /// <param name="fileName">文件名。</param>
  /// <returns></returns>
  public static Encoding GetEncoding(string fileName)
  {
   return GetEncoding(fileName, Encoding.Default);
  }
  /// <summary>
  /// 取得一个文本文件流的编码方式。
  /// </summary>
  /// <param name="stream">文本文件流。</param>
  /// <returns></returns>
  public static Encoding GetEncoding(FileStream stream)
  {
   return GetEncoding(stream, Encoding.Default);
  }
  /// <summary>
  /// 取得一个文本文件的编码方式。
  /// </summary>
  /// <param name="fileName">文件名。</param>
  /// <param name="defaultEncoding">默认编码方式。当该方法无法从文件的头部取得有效的前导符时,将返回该编码方式。</param>
  /// <returns></returns>
  public static Encoding GetEncoding(string fileName, Encoding defaultEncoding)
  {
   FileStream fs = new FileStream(fileName, FileMode.Open);
   Encoding targetEncoding = GetEncoding(fs, defaultEncoding);
   fs.Close();
   return targetEncoding;
  }
  /// <summary>
  /// 取得一个文本文件流的编码方式。
  /// </summary>
  /// <param name="stream">文本文件流。</param>
 /// <param name="defaultEncoding">默认编码方式。当该方法无法从文件的头部取得有效的前导符时,将返回该编码方式。</param>
  /// <returns></returns>
  public static Encoding GetEncoding(FileStream stream, Encoding defaultEncoding)
  {
   Encoding targetEncoding = defaultEncoding;

   if(stream != null && stream.Length >= 2)
   {
    //保存文件流的前4个字节
    byte byte1 = 0;
    byte byte2 = 0;
    byte byte3 = 0;
    byte byte4 = 0;
    //保存当前Seek位置
    long origPos = stream.Seek(0, SeekOrigin.Begin);

    stream.Seek(0, SeekOrigin.Begin);

     int nByte = stream.ReadByte();
    byte1 = Convert.ToByte(nByte);

    byte2 = Convert.ToByte(stream.ReadByte());

    if(stream.Length >= 3)
    {
     byte3 = Convert.ToByte(stream.ReadByte());
    }
    if(stream.Length >= 4)
    {
     byte4 = Convert.ToByte(stream.ReadByte());
    }

    //根据文件流的前4个字节判断Encoding
    //Unicode {0xFF, 0xFE};
    //BE-Unicode {0xFE, 0xFF};
    //UTF8 = {0xEF, 0xBB, 0xBF};

    if(byte1 == 0xFE && byte2 == 0xFF)//UnicodeBe
    {
     targetEncoding = Encoding.BigEndianUnicode;
    }
    if(byte1 == 0xFF && byte2 == 0xFE && byte3 != 0xFF)//Unicode
    {
     targetEncoding = Encoding.Unicode;
    }
    if(byte1 == 0xEF && byte2 == 0xBB && byte3 == 0xBF)//UTF8
    {
     targetEncoding = Encoding.UTF8;
    }

    //恢复Seek位置 

    stream.Seek(origPos, SeekOrigin.Begin);

   }
   return targetEncoding;
  }

 }
}

 

using System;
using Farproc.Text;
using System.Text;
using System.IO;
{
 /// <summary>
 /// Class1 的摘要说明。
 /// </summary>
 class Class1
 {
  /// <summary>
  /// 应用程序的主入口点。
  /// </summary>
  [STAThread]
  static void Main(string[] args)
  {
   string fileName = @"e:\a.txt";

   //生成一个big endian Unicode编码格式的文本文件

   StreamWriter sw = new StreamWriter(fileName, false, Encoding.BigEndianUnicode);//你可以试试其他编码,比如Encoding.GetEncoding("GB2312")或UTF8

   sw.Write("这是一个String");

   sw.Close();

   //读取
   Encoding fileEncoding = TxtFileEncoding.GetEncoding(fileName, Encoding.GetEncoding("GB2312"));//取得这txt文件的编码

   Console.WriteLine("这个文本文件的编码为:" + fileEncoding.EncodingName);
   StreamReader sr = new StreamReader(fileName, fileEncoding);//用该编码创建StreamReader
   //用下面的方法虽然可以让系统自动判断文本文件的编码格式,但是我们无法取得该文本文件的编码
   //sr.CurrentEncoding永远为 Unicode(UTF-8)
   //StreamReader sr = new StreamReader(fileName, true);
   //Console.WriteLine("这个文本文件的编码为:" + sr.CurrentEncoding.EncodingName);
   Console.WriteLine("这个文本文件的内容为:" + sr.ReadToEnd());

   sr.Close();

   Console.ReadLine();

  }
 }

}

 

posted on 2005-09-15 14:34  Mat  阅读(636)  评论(0)    收藏  举报

导航