[英]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 191
或EF 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.