为什么我不能将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
。