如何确保XDocument以utf-8文件编码保存

本文关键字:utf-8 文件 编码 保存 XDocument 何确保 确保 | 更新日期: 2023-09-27 17:50:01

我正在用以下代码创建一个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

如何确保XDocument以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);
    }
}