【问题标题】:StreamWriter and Encoding.UTF8.GetBytes produces different results [duplicate]StreamWriter 和 Encoding.UTF8.GetBytes 产生不同的结果[重复]
【发布时间】:2018-06-27 13:27:57
【问题描述】:

为什么用StreamWriterUTF8.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);

【问题讨论】:

    标签: c# utf-8


    【解决方案1】:

    这一切都与BOMEncoding.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)
    

    这样两个二进制文件将相等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-12
      • 2013-06-04
      • 2018-01-06
      • 2012-04-02
      • 1970-01-01
      • 2018-04-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多