冬眠
“如果你觉得自己在为傻瓜设计产品,那么很可能不仅无法设计出优秀的产品,而且连傻瓜也不喜欢你的设计。”--Paul Graham

导航

 

  在操作txt的时候,有时会出现乱码,这是因为没有使用正确的编码方式来操作txt,我们需要先获取txt的编码方式,再进行读写操作。下面是获取txt编码的方法:

/// <summary>
/// 获取TXT文件的编码方式
/// </summary>
public static class GetTxtFileEncoding
{
    /// <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)
    {
        using (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
            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;
    }
}

 

posted on 2013-09-27 10:22  无尽的冬眠  阅读(815)  评论(0编辑  收藏  举报