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

时间:2015-05-19 14:36:55

标签: c# xml unicode encoding utf-8

我正在使用以下代码创建一个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字符是“错误的”:

<?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)编码打开生成的文件。

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

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

https://stackoverflow.com/a/3871822/401828

1 个答案:

答案 0 :(得分:3)

如果你想要细粒度的编码控制,你可能想要控制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);
    }
}