如何确保使用 utf-8 文件编码保存 XDocument?

How to make sure a XDocument is saved with utf-8 file encoding?

我正在使用以下代码创建一个 Xml 文件(Serialize() 返回的字节数组稍后写入 FileStream):

    public byte[] Serialize()
    {
        using (var stream = new MemoryStream())
        {
            WriteXmlToStream(stream);

            stream.Position = 0;                

            using (var reader = new StreamReader(stream))
            {
                string resultString = reader.ReadToEnd();
                return Encoding.UTF8.GetBytes(resultString);
            }
        }
    }

    private void WriteXmlToStream(MemoryStream stream)
    {
        var document = 
            new XDocument(
                new XElement("Coleta",
                    new XElement("Operador", Operador),
                    new XElement("Sujeito", Sujeito),
                    new XElement("Início", DataHora.ToString(Constantes.FormatoDataHora)),
                    new XElement("Descrição", Descrição),
                    // and so on
                    )
                )
            );

        document.Save(stream);
    }

但是当我打开保存的文件时,unicode字符是"wrong":

<?xml version="1.0" encoding="utf-8"?>
    <Coleta>
      <Operador>Nome do Operador do Sofware</Operador>
      <Sujeito>Nome Paciente de Teste</Sujeito>
      <Início>2015-05-19T02:24:10.10Z</Início>
      <Descrição>Coleta de teste para validação do formato de arquivo.</Descrição>
      <Sensores>
        <SensorInfo>
          <Sensor>
            <Nome />
            <PosiçãoAnatômica>NãoEspecificada</PosiçãoAnatômica>
            <Canais>
              <Canal>
              <!-- and so on -->

那么我没有做什么或做错了什么,我该如何解决?我总是很难理解这些编码特性。

如评论中所述,这是因为文件编辑器未使用正确的 (utf-8) 编码打开生成的文件。

所以我的问题是:我应该如何强制对文件进行编码?

更新:似乎这个答案可能是相关的:

如果你想要细粒度的编码控制,你可能想要控制TextWriter;例如,在下面的示例中,我使用的是 UTF-8 sans-BOM。但是,如果可能,您也可以通过 FileStream...

直接写入文件
using System;
using System.IO;
using System.Text;
using System.Xml.Linq;


class Program
{
    static void Main()
    {
        var bytes = new Program().Serialize();
        File.WriteAllBytes("my.xml", bytes);
    }
    public byte[] Serialize()
    {
        using (var stream = new MemoryStream())
        {
            WriteXmlToStream(stream);

            return stream.ToArray();
        }
    }

    private void WriteXmlToStream(Stream stream)
    {
        var document =
            new XDocument(
                new XElement("Coleta",
                    new XElement("Operador", "foo"),
                    new XElement("Sujeito", "bar"),
                    new XElement("Início", DateTime.Now),
                    new XElement("Descrição", "Descrição")
                    // and so on
                    )
                );
        using (var writer = new StreamWriter(stream, new UTF8Encoding(false)))
        {
            document.Save(writer);
        }
    }
}

以上工作正常,编码正确。

改为直接写入文件:

public void Serialize(string path)
{
    using (var stream = File.Create(path))
    {
        WriteXmlToStream(stream);
    }
}