我制作了一个新的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
,选择适当的选项。