zoukankan      html  css  js  c++  java
  • 获取txt编码方式

      在操作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;
        }
    }
  • 相关阅读:
    vim复制
    嵌入式Linux学习(二)
    (Java实现) 洛谷 P1042 乒乓球
    (Java实现) 洛谷 P1042 乒乓球
    (Java实现) 洛谷 P1071 潜伏者
    (Java实现) 洛谷 P1071 潜伏者
    (Java实现) 洛谷 P1025 数的划分
    (Java实现)洛谷 P1093 奖学金
    (Java实现)洛谷 P1093 奖学金
    Java实现 洛谷 P1064 金明的预算方案
  • 原文地址:https://www.cnblogs.com/hibernation/p/3342262.html
Copyright © 2011-2022 走看看