首页 > 其他分享 >.net 各种文件编码方式读取txt文件

.net 各种文件编码方式读取txt文件

时间:2024-03-08 09:34:47浏览次数:18  
标签:文件 编码方式 return Encoding buffer System fs new txt

txt文件,有不同的编码方式,导入到系统有时不识别,故做以下适配。

#region 字节流编码格式判断
        /// <summary>
        /// 获取txt文件内容行
        /// 兼容不同的编码方式
        /// </summary>
        /// <param name="stream"></param>
        /// <param name="isTrim">是否去除行两边空白字符</param>
        /// <param name="isBlank">是否包含空白行</param>
        /// <returns></returns>
        public static List<string> GetLinesFromTxt(Stream stream, bool isTrim = true, bool isBlank = false)
        {
            #region 读取txt文件
            List<string> paragraphList = new List<string>();
            var encoding = SowerPower.Common.Utils.GetStreamEncoding(stream);
            using (StreamReader sr = new StreamReader(stream, encoding))
            {
                string lineTxt = "";
                while ((lineTxt = sr.ReadLine()) != null)
                {
                    var trimTxt = lineTxt.Trim();
                    if (!isBlank && trimTxt.Length == 0)
                    {
                        continue;
                    }
                    if (isTrim) paragraphList.Add(trimTxt);
                    else paragraphList.Add(lineTxt);
                }

            }
            //sr.Close();
            //sr.Dispose();
            return paragraphList;
            #endregion
        }
        /// <summary>
        /// 判断获取字节流 编码格式,主要用于txt文件内容读取
        /// </summary>
        /// <param name="fs"></param>
        /// <returns></returns>
        public static Encoding GetStreamEncoding(Stream fs)
        {
            fs.Position = 0;
            if (fs.Length < 2) return System.Text.Encoding.Default;
            System.IO.BinaryReader br = new System.IO.BinaryReader(fs);
            Byte[] buffer = br.ReadBytes(2);
            fs.Position = 0;
            if (buffer[0] >= 0xEF)
            {
                if (buffer[0] == 0xEF && buffer[1] == 0xBB)
                {
                    return System.Text.Encoding.UTF8;
                }
                else if (buffer[0] == 0xFE && buffer[1] == 0xFF)
                {
                    return System.Text.Encoding.BigEndianUnicode;
                }
                else if (buffer[0] == 0xFF && buffer[1] == 0xFE)
                {
                    return System.Text.Encoding.Unicode;
                }
                else
                {
                    return System.Text.Encoding.Default;
                }
            }
            else
            {

                fs.Position = 0;
                br = new System.IO.BinaryReader(fs);
                buffer = br.ReadBytes((int)fs.Length);
                fs.Position = 0;
                ///判断是否不带bom的utf8格式
                if (IsUTF8BytesWithoutBOM(buffer))
                {
                    return new UTF8Encoding(false);
                }
                return System.Text.Encoding.Default;
            }
        }
        /// <summary>
        /// 判断是否不包含 bom的utf8格式
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        private static bool IsUTF8BytesWithoutBOM(byte[] data)
        {
            try
            {
                int charByteCounter = 1; //计算当前正分析的字符应还有的字节数
                byte curByte; //当前分析的字节.
                for (int i = 0; i < data.Length; i++)
                {
                    curByte = data[i];
                    if (charByteCounter == 1)
                    {
                        if (curByte >= 0x80)
                        {
                            //判断当前
                            while (((curByte <<= 1) & 0x80) != 0)
                            {
                                charByteCounter++;
                            }
                            //标记位首位若为非0 则至少以2个1开始 如:110XXXXX...........1111110X 
                            if (charByteCounter == 1 || charByteCounter > 6)
                            {
                                return false;
                            }
                        }
                    }
                    else
                    {
                        //若是UTF-8 此时第一位必须为1
                        if ((curByte & 0xC0) != 0x80)
                        {
                            return false;
                        }
                        charByteCounter--;
                    }
                }
                if (charByteCounter > 1)
                {
                    return false;
                    //throw new Exception("非预期的byte格式");
                }
                return true;
            }
            catch
            {
                return false;
            }
        }

        #endregion

标签:文件,编码方式,return,Encoding,buffer,System,fs,new,txt
From: https://www.cnblogs.com/javacoffeenet/p/18060310

相关文章

  • Mybatis20_MyBatis映射文件深入(动态SQL)6
    一、动态sql语句1、动态sql语句概述Mybatis的映射文件中,前面我们的SQL都是比较简单的,有些时候业务逻辑复杂时,我们的SQL是动态变化的,此时在前面的学习中我们的SQL就不能满足要求了。2、环境搭建UserMapper.javapackagecom.itheima.mapper;importcom.......
  • Python入门基础知识(简介、文件格式、终端、执行)
    Python入门基础知识,几天跟大家分享的是关于学习Python需要了解的入门基础知识。一起看一看吧!一、Python简介Python定义:是一个免费、开源、跨平台、动态、面向对象的编程语言。Python程序的执行(运行)方式有两种:交互式、文件式交互式即在命令行输入指令,回车即可得到结果......
  • oracle 控制文件重建
    3.5 恢复与重建3.5.1恢复控制文件方法控制文件一旦损坏,系统将不能正常工作。受损的控制文件会记录在告警日志中,恢复或重建控制文件必须使系统在NOMOUNT下1)单个文件损坏了:参照多元化章节,通过简单复制解决。2)所有的控制文件丢失:①如果有binary控制文件备份,利用备份恢复控制文......
  • Linux文件管理
    Linux文件管理学习目标了解文件名规则和工作中的建议命名规则会创建和删除目录mkdir/rmdir会创建和删除文件touch/rm了解复制cp和移动mv的区别会使用tar命令进行压缩和解压缩掌握vm的保存和退出和不保存强制退出q!掌握vim的快捷方式yy,dd,gg,G,u会使用tail命令来查看文件......
  • electron暴露配置文件(用户可随时修改)
    配置文件一般web前端项目配置文件,写死的放在src/config下,需要打包配置的放在.env文件中。但在electron项目中,如果配置数据更改,需要每次给用户打包升级肯定是行不通的。于是外部配置文件就是有必要的,具体实现方法也比较简单,通过fs去读写外部文件就可实现具体实现设置文件不被压......
  • Docker使用docker-compose.yml文件(六)
    前言前面介绍的都是单个容器部署,对于多容器部署也是一个个部署。这里Docker开发了docker-compose.yml。它是一个YAML格式的文件,用于定义和运行多容器的Docker应用程序。它允许你使用单个命令来启动、停止和重启应用程序,以及管理应用程序依赖的服务。一、配置yml文件versio......
  • ajax请求下载excel文件
    改一个页面:js新打开一个页面,页面的地址为一个get请求接口,由于传递的字符串变多,要改为post请求。没办法使用js打开新窗口这种了,考虑ajax请求。写个demo记录下<script>functiondownloadFile(url,data){$.ajax({url:url,type:"POST",cache:fals......
  • Python中Spark读取parquet文件并获取schema的JSON表示
     步骤:初始化SparkSession。使用spark.read.parquet()读取Parquet文件。调用df.schema.json()获取schema的JSON表示。frompyspark.sqlimportSparkSession#初始化SparkSessionspark=SparkSession.builder.appName("ReadParquetSchema").getOrCreate(......
  • element-ui 文件上传问题记录
    今天做用element文件上传组件遇到个问题,部分代码如下:   后台代码 测试文件怎么都传不到后台去,用postman上传又可以。最后喊前端同事看了下,前端取文件的时候不能直接写,要取file.raw,像这样: 然后就可以了......
  • 如何将PDF文件无损压缩到更小?
    有时候我们为了提高文件传输速度,会适当压缩一下PDF文件大小,但很多朋友不知道怎么将PDF文件压缩的小一点,考虑到下载安装软件比较复杂还只能电脑使用,下面就给大家分享二个在线就能PDF压缩得方法,一起来了解下吧。方法一:ilovepdf中文版ilovepdf中文版是一款专业的在线PDF转换工具,网......