2015-05-19 66 views
1

我创建用下面的代码XML文件(由Serialize()返回的字节数组被写入FileStream后):如何确保使用utf-8文件编码保存XDocument?

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

你是如何打开这个文件?这可能只是记事本是垃圾......确保你用UTF-8打开它。 –

+0

我试过这个,它工作正常,所以我只能重新迭代Jon Skeet上面说的 - 你如何验证输出? –

+0

重新'StreamReader()'等 - 任何你不能只使用'return stream.ToArray();'的原因吗? –

回答

2

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

要去尝试午饭后吧,谢谢你了!:D – heltonbiker

+1

@heltonbiker侧注意,并重复:请不要自己格式化DateTime:让xml api担心日期的正确格式。 –

+0

这非常有用,非常感谢你! – heltonbiker