为什么我不能将XDocument XDeclaration编码类型设置为iso-8859-1?

为什么下面的代码没有设置XML声明编码类型? 它总是将编码设置为utf-16。 我错过了一些非常明显的事吗?

var xdoc = new XDocument( new XDeclaration("1.0", "iso-8859-1", null), new XElement("root", "") ); 

输出:

   

请参阅有关指定TextWriter编码的答案。

ISO-8859-1且不说: ISO-8859-1是字符集,而不是编码。 Unicode也是一个字符集,但UTF-16是将Unicode字符集编码为字节序列。 您不能将文档的编码指定为ISO-8859-1 ,就像您不能将文档的字符集指定为UTF-16 。 请注意, Unicode是本机字符集, UTF-16是.NET和Java String类以及基于文本或基于字符串的操作的本机Unicode编码。

如上所述,.NET XML / Stream编写实现从已声明的XML编码以外的某处“拾取”或解释编码。 我已经成功测试了一个工作解决方案,如早期Stackoverflowpost中包含的URL所述

 XDocument xmlDoc = new XDocument( new XDeclaration("1.0", "utf-8", "no"), new XElement("foo", "bar")); MemoryStream memstream = new MemoryStream(); XmlTextWriter xmlwriter = new XmlTextWriter(memstream, new UTF8Encoding()); //'Write' (save) XDocument XML to MemoryStream-backed XmlTextWriter instance xmlDoc.Save(xmlwriter); //Read back XML string from stream xmlwriter.Flush(); memstream.Seek(0, SeekOrigin.Begin); //OR "stream.Position = 0" StreamReader streamreader = new StreamReader(memstream); string xml = streamreader.ReadToEnd(); Console.WriteLine(xml); Console.WriteLine(reader.ReadToEnd()); 

我希望这有助于某人。

干杯

我在某种程度上找不到任何有效的答案,所以这里有一个实际的解决方案,它将在标题中输出所需的编码:

  private void CreateXml() { XmlTextWriter xmlwriter = new XmlTextWriter("c:\\test.xml", Encoding.GetEncoding("iso-8859-1")); XDocument xdoc = new XDocument( new XElement("Test") ); xdoc.Save(xmlwriter); xmlwriter.Close(); } 

你得到UTF-16的原因是字符串在内存中用UTF-16编码,只要你没有为XML的输出指定编码,它就会覆盖XML头中的编码来匹配正在使用的实际编码。 使用XmlTextWriter是指定不同编码的一种方法。

您还可以让XmlTextWriter写入MemoryStream ,然后在需要在内存中执行整个操作时将其转换回string