使用BinaryWriter写入文件时开头出现特殊字符,求原因及解决方法
问题成因与解决办法
嘿,这个问题我之前帮人排查过,咱们先搞清楚为啥会出现乱码,再给你几个靠谱的解决思路:
为啥开头会出现特殊字符?
你用的BinaryWriter.Write(string)方法,本质是为二进制数据序列化设计的,不是用来写纯文本的。当你调用这个方法时,它会先往文件里写入一个4字节的二进制长度前缀(用来记录后续字符串的字节数),然后才写字符串的内容。
这个二进制的长度值,被文本编辑器当成普通文本字符解码后,就变成了你看到的“”这类乱码——编辑器根本不知道这是个长度标记,只会按当前编码(比如UTF-8)去解析,自然就出问题了。
解决办法
根据你的需求,有两种常见的处理方式:
1. 改用专门的文本写入类:StreamWriter
如果你的文件就是纯文本格式,那StreamWriter才是正确的选择,它不会添加任何二进制前缀,直接写入文本内容:
using (FileStream fs = new FileStream(FILE_NAME, FileMode.CreateNew)) { using (StreamWriter w = new StreamWriter(fs)) { w.Write(@" COMMENT: OnDemand Generic Index File Format COMMENT: This file has been generated by DOC Application COMMENT: date"); } }
如果需要指定编码(比如不想带UTF-8 BOM),可以给StreamWriter加编码参数:
using (StreamWriter w = new StreamWriter(fs, new UTF8Encoding(false)))
2. 坚持用BinaryWriter?手动处理字符串写入
如果你因为某些原因必须用BinaryWriter(比如要在文件里混合写入二进制数据和文本),那别用默认的Write(string),而是先把字符串转成字节数组再写入,这样就不会带长度前缀了:
using (FileStream fs = new FileStream(FILE_NAME, FileMode.CreateNew)) { using (BinaryWriter w = new BinaryWriter(fs, Encoding.UTF8)) { byte[] textContent = Encoding.UTF8.GetBytes(@" COMMENT: OnDemand Generic Index File Format COMMENT: This file has been generated by DOC Application COMMENT: date"); w.Write(textContent); } }
简单总结:BinaryWriter是给二进制格式文件用的,纯文本场景选StreamWriter就不会有这类问题啦~
内容的提问来源于stack exchange,提问作者Anirudh Agarwal
相关产品推荐
相关产品推荐

