2015-05-19 56 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

相關問題