为什么使用StreamWriter
和UTF8.GetBytes
将字符串编码为byte []会产生不同的结果?:
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);
答案 0 :(得分:1)
所有关于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)
这样两个二进制文件都是相同的。