为什么使用 StreamWriter
将字符串编码为 byte[]和UTF8.GetBytes
产生不同的结果?:
string value = "myTestValue";
byte[] data = Encoding.UTF8.GetBytes(value);
byte[] streamedData;
using (var memoryStream = new MemoryStream())
using (var streamWriter = new StreamWriter(memoryStream, Encoding.UTF8))
{
streamWriter.Write(value);
streamWriter.Flush();
streamedData = memoryStream.ToArray();
}
//false
data.SequenceEqual(streamedData);
最佳答案
这都是关于 BOM以及 Encoding.GetBytes()
的实现方式。
静态对象 Encoding.UTF8
被初始化为包含 BOM,如您在
Encoding.UTF8.GetPreamble();
因此 StreamWriter 正确地将其写入给定的 Stream 对象(带有 BOM)。然而,Encoding.GetBytes()
永远不会发出 BOM;即使您构造 UTF8Encoding 对象来执行此操作:
byte[] withoutBom = new UTF8Encoding(false).GetBytes(value);
byte[] withBom = new UTF8Encoding(true).GetBytes(value);
// true
withoutBom.SequenceEqual(withBom);
如果您希望 StreamWriter 进行无 BOM 编码,您可以像这样初始化它:
new StreamWriter(stream, new UTF8Encoding(false)
这样两个二进制文件将是相等的。
关于c# - StreamWriter 和 Encoding.UTF8.GetBytes 产生不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48321896/