繁体   English   中英

C# StreamWriter 向 Stream 写入额外的字节

[英]C# StreamWriter writes extra bytes to the Stream

var memStream = new MemoryStream();
using (var sw = new StreamWriter(memStream, Encoding.UTF8, 4194304 /* 4 MiB */, leaveOpen: true))
{
     var str = new string(Enumerable.Repeat(' ', 10240 /* 10 * KiB */).ToArray());
     Console.WriteLine(str.Length);
     Console.WriteLine(Encoding.UTF8.GetBytes(str).Length);
     sw.Write(str);
     sw.Flush();
     Console.WriteLine(memStream.Length);
}
// Output
// ---------
// 10240
// 10240
// 10243

// Output which I was expecting
// ---------
// 10240
// 10240
// 10240

我检查了 MSDN 上的 StreamWriter.Write(String) 文档,但没有找到任何提到此 API 可以将额外字节写入流的内容。 ( MSDN Doc StreamWriter.Write )。 我正在使用 .NET Core 3.1,但我猜测这种行为也适用于 Core 2.0 和 Framework,尽管我没有明确地测试我的假设。 我彻底阅读了StreamWriter文档,我没有发现任何关于这种行为的提及。 这是错误还是预期行为,还是我遗漏了什么?

您可以通过使用new UTF8Encoding(false)创建不应发出 UTF8 标识符的UTF8Encoding来阻止 BOM 的输出:

var memStream = new MemoryStream();
using (var sw = new StreamWriter(memStream, new UTF8Encoding(false), 4194304 /* 4 MiB */, leaveOpen: true))
{
    var str = new string(Enumerable.Repeat(' ', 10240 /* 10 * KiB */).ToArray());
    Console.WriteLine(str.Length);
    Console.WriteLine(Encoding.UTF8.GetBytes(str).Length);
    sw.Write(str);
    sw.Flush();
    Console.WriteLine(memStream.Length);
}

当我在本地运行它时,我得到

10240
10240
10243

在进一步检查中,额外的 3 个字节似乎位于流的开头239 187 191EF BB BF十六进制。 这是字节顺序标记 (BOM) https://en.wikipedia.org/wiki/Byte_order_mark

要从输出中删除这些额外的字符,请使用new UTF8Encoding(false)来省略 BOM,而不是在创建 StreamWriter 时使用Encoding.UTF8

using (var sw = new StreamWriter(memStream, new UTF8Encoding(false), 4194304 /* 4 MiB */, leaveOpen: true))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM