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文档,但没有发现这种行为。这是错误还是预期的行为,或者我缺少什么?
您可以通过使用UTF8Encoding
创建不应发出UTF8标识符的new UTF8Encoding(false)
来防止BOM表的输出:
当我在LINQPad 6中运行时,我得到了