我正在使用以下代码创建一个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)编码打开生成的文件。
所以我的问题是:我应该如何强制编码到文件?
更新:似乎这个答案可能是相关的:
答案 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);
}
}