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来标记文本文件的编码方式的。


目录
相关文章
C#编程-118:写入文件StreamWriter类
C#编程-118:写入文件StreamWriter类
110 0
C#编程-118:写入文件StreamWriter类
|
编解码 C#
C#(三十八)之StreamWriter StreamWriter使用方法及与FileStream类的区别
本篇内容记录了StreamReader类的属性和方法、StreamWriter类的属性和方法等
279 0
C#(三十八)之StreamWriter StreamWriter使用方法及与FileStream类的区别
|
1月前
|
C#
24. C# 编程:用户设定敌人初始血值的实现
24. C# 编程:用户设定敌人初始血值的实现
19 0
|
2月前
|
SQL 数据库连接 应用服务中间件
C#WinForm基础编程(三)
C#WinForm基础编程
73 0
|
2月前
C#WinForm基础编程(二)
C#WinForm基础编程
55 0
|
2月前
|
C# 数据安全/隐私保护
C#WinForm基础编程(一)
C#WinForm基础编程
60 0
|
4月前
|
数据采集 前端开发 C#
C#编程艺术:Fizzler库助您高效爬取www.twitter.com音频
Twitter是全球最大的社交媒体平台之一,包含丰富的音频资源。用户可以在Twitter上发布、转发、评论和收听各种音频内容,如音乐、播客、新闻、故事等,直接从Twitter抓取音频数据并非易事,尤其是在考虑到可能的封锁和反爬虫机制。Twitter会对频繁访问的IP地址进行限制或封禁,以防止恶意爬虫的行为。因此,我们需要使用一些技术手段来规避这些障碍,确保稳定而高效的数据访问。
C#编程艺术:Fizzler库助您高效爬取www.twitter.com音频
|
3月前
|
程序员 C#
深入理解 C# 编程:枚举、文件处理、异常处理和数字相加
枚举是一个特殊的“类”,表示一组常量(不可更改/只读变量)。 要创建枚举,请使用 enum 关键字(而不是 class 或 interface),并用逗号分隔枚举项:
38 0
|
2天前
|
存储 安全 网络安全
C#编程的安全性与加密技术
【4月更文挑战第21天】C#在.NET框架支持下,以其面向对象和高级特性成为安全软件开发的利器。本文探讨C#在安全加密领域的应用,包括使用System.Security.Cryptography库实现加密算法,利用SSL/TLS保障网络传输安全,进行身份验证,并强调编写安全代码的重要性。实际案例涵盖在线支付、企业应用和文件加密,展示了C#在应对安全挑战的同时,不断拓展其在该领域的潜力和未来前景。