C# 通过StreamWriter输出的TXT流文件,前缀带EF BB BF

简介: C# 通过StreamWriter输出的TXT流文件,前缀带EF BB BF

好久没有动笔写博客了,这个小天地被我闲置的放了好久好久,接下来要慢慢捡起来了。


备注:通过C#的StreamWriter类输出一个TXT流文件,供下位机工程师使用,发现打开的16进制文件中,默认添加了EF BB BF前缀。


public int SaveZAbnormalScrollbaskTxt(string strTargetPath)
        {
            try
            {
                string strBufferLine = "";
                string expressionString = null;
                int nNumber = 0;
                DataRow dr;
                StreamWriter streamWriter = new StreamWriter(strTargetPath, false,Encoding.UTF8);
                for (int i = 0; i < dbZStressAbnormalStatistics.Rows.Count; i++)
                {
                    dr = dbZStressAbnormalStatistics.Rows[i];
                    //从特征点表中取到经纬度方向,距离等值。
                    if (Convert.ToString(dr[4]) == "" && String.IsNullOrEmpty(Convert.ToString(dr[4])))
                        continue;
                    var gpsDr = GetGpsPointRow(dr[2].ToString(), dr[1].ToString());
                    if (gpsDr == null)
                        continue;
                    strBufferLine = "00" + (++nNumber) + "," + dr[2] + "," + gpsDr[3] + "," + dr[1] + "," + gpsDr[5] + "," + gpsDr[6] +
                                    "," + gpsDr[1] + "," + dr[7] + ",X";
                    if (strBufferLine.Length<64)
                    {
                        for (int j = strBufferLine.Length; j < 62; j++)
                        {
                            strBufferLine +=" ";
                        }
                        strBufferLine += "\r\n";
                    }
                    var ab = strBufferLine.Length;
                    streamWriter.Write(strBufferLine);
                }
                streamWriter.Close();
                streamWriter.Dispose();
                return 100;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }




代码中默认是以UTF-8格式输出保存的,通过记事本和NotPadd++打开都没有问题,但只要以16进制打开就会显示默认的EF BB BF格式前缀。


679140-20201205110131738-1867767295.png

经查验,发现windows电脑在使用过程中,会将文件默认添加EF BB BF前缀,网上给出的解答说是转换为GB2312这种中国编码制定的格式就可以。


 StreamWriter streamWriter = new StreamWriter(strTargetPath, false,Encoding.GetEncoding("GB2312"));


试了试确实可以解决了我的问题。


679140-20201205110133142-1187668080.png


既然找到问题的根源,那么就顺便记录下具体的原因吧。


Unicode规范中有一个BOM的概念。BOM——Byte Order Mark,就是字节序标记。在这里找到一段关于BOM的说明:



在UCS 编码中有一个叫做"ZERO WIDTH  NO-BREAK  SPACE"的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。


UCS规范建议我们在传输字节流前,先传输字符"ZERO  WIDTH NO-BREAK  SPACE"。这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-  Endian的。


因此字符"ZERO WIDTH NO-BREAK SPACE"又被称作BOM。


UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8编码是EF BB BF。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。


Windows就是使用BOM来标记文本文件的编码方式的。


目录
相关文章
|
6月前
|
C#
C#读取txt文本的行数
C#读取txt文本的行数
187 0
|
前端开发 C#
C# 基于NPOI+Office COM组件 实现20行代码在线预览文档(word,excel,pdf,txt,png)
C# 基于NPOI+Office COM组件 实现20行代码在线预览文档(word,excel,pdf,txt,png)
|
6月前
|
开发框架 安全 .NET
C# .NET面试系列三:集合、异常、泛型、LINQ、委托、EF!
<h2>集合、异常、泛型、LINQ、委托、EF! #### 1. IList 接口与 List 的区别是什么? IList 接口和 List 类是C#中集合的两个相关但不同的概念。下面是它们的主要区别: <b>IList 接口</b> IList 接口是C#中定义的一个泛型接口,位于 System.Collections 命名空间。它派生自 ICollection 接口,定义了一个可以通过索引访问的有序集合。 ```c# IList 接口包含一系列索引化的属性和方法,允许按索引访问、插入、移除元素等。 由于是接口,它只定义了成员的契约,而不提供具体的实现。类似于 IEnumera
347 2
|
6月前
|
XML JSON 数据处理
C# | 导出DataGridView中的数据到Excel、CSV、TXT
从DataGridView中导出数据到Excel、CSV、TXT是开发中非常常见的一种需求。本文将讲解如何高效的完成对这三种格式的单向导出。 倘若直接写三种格式的导出必定会产生大量的重复代码,而从表中获取结构化数据的思路是基本一致的,因此有一个思路是先将DataGridView中的数据转换为DataTable对象,再进一步导出成我们的目标格式。 本文将介绍如何将DataGridView中的数据转换为DataTable格式,并提供将DataTable转换为Excel、CSV、TXT三种格式的例子。
548 0
C# | 导出DataGridView中的数据到Excel、CSV、TXT
c# EF导出到word
c# EF导出到word
49 0
|
C#
c#——将错误日志记录在txt文本里
c#——将错误日志记录在txt文本里
315 0
c#——将错误日志记录在txt文本里
|
大数据 C#
C# 读取大文件 (可以读取3GB大小的txt文件)
原文:C# 读取大文件 (可以读取3GB大小的txt文件) 在处理大数据时,有可能 会碰到 超过3GB大小的文件,如果通过 记事本 或 NotePad++去打开它,会报错,读不到任何文件。
4245 1
|
缓存 关系型数据库 MySQL
C#-EF Core使用MySQL数据库
Entity Framework Core (EF Core)是微软推荐的基于.NET Core 的应用程序数据访问技术。开源,轻量级,可扩展并且支持跨平台开发。EF Core是一种对象关系映射器(ORM),通过应用程序实体对象和关系数据库中的数据的映射,使得开发人员能够以面向对象的方式处理数据。
613 0
C# EF ExcelHelper 导入导出
C# EF ExcelHelper 导入导出
114 0
C#编程-118:写入文件StreamWriter类
C#编程-118:写入文件StreamWriter类
149 0
C#编程-118:写入文件StreamWriter类