StreamWriter 的默认 UTF-8 编码器不返回前导码



我制作了一个新的netcoreapp2.2应用程序,并运行了以下代码:

public static int Main(string[] args)
{
using (var memoryStream = new MemoryStream())
using (var writer = new StreamWriter(memoryStream))
{
Console.WriteLine("StreamWriter:");
PrintEncodingConfiguration(writer.Encoding);
Console.WriteLine("Encoding.UTF8:");
PrintEncodingConfiguration(Encoding.UTF8);
}
return 0;
}
private static void PrintEncodingConfiguration(Encoding encoding)
{
Console.WriteLine("   Encoding name: " + encoding.EncodingName);
Console.WriteLine("   Web name:      " + encoding.WebName);
Console.WriteLine("   Header name:   " + encoding.HeaderName);
Console.WriteLine("   Body name:     " + encoding.BodyName);
Console.WriteLine("   Preamble:      " + BitConverter.ToString(encoding.GetPreamble()));
Console.WriteLine();
}

StreamWriter的构造函数包含以下摘要:

使用UTF-8编码和默认缓冲区大小初始化指定流的System.IO.StreamWriter类的新实例。

所以我猜测上面的两个编码是相同的。但这是上面程序的输出:

StreamWriter:
Encoding name: Unicode (UTF-8)
Web name:      utf-8
Header name:   utf-8
Body name:     utf-8
Preamble:
Encoding.UTF8:
Encoding name: Unicode (UTF-8)
Web name:      utf-8
Header name:   utf-8
Body name:     utf-8
Preamble:      EF-BB-BF

正如你所看到的,两个编码器都提供了相同的名称(也正确地编码/解码字节和字符串AFAIK(,但流写入程序不提供前导码,而静态编码器提供前导码。

这种奇怪的行为有什么原因吗?

前导码在编码级别是可选的;CCD_ 3和CCD_ 4提供具有/不具有作为唯一区别的BOM(前导码(的UTF8编码。CCD_ 5使用";用";并且显然出于某种原因StreamWriter在该场景中选择";没有";,但两者都是有效的,并且都不是"有效"的;右";或";错误";。

如果您非常关心BOM是否存在:请自己明确提供Encoding,选择适当的选项。

最新更新