为什么下面的代码没有设置XML声明编码类型?它总是将编码设置为utf-16。我错过了一些非常明显的东西吗?
var xdoc = new XDocument(
new XDeclaration("1.0", "iso-8859-1", null),
new XElement("root", "")
);
输出:
<?xml version="1.0" encoding="utf-16"?>
<root></root>
答案 0 :(得分:5)
请参阅有关指定TextWriter
编码的答案。
暂且不说:ISO-8859-1
是字符集,而不是编码。 Unicode
也是一个字符集,但UTF-16
是将Unicode
字符集编码为字节序列。您无法将文档的编码指定为ISO-8859-1
,就像您无法将文档的字符集指定为UTF-16
一样。请注意,Unicode
是本机字符集,UTF-16
是.NET和Java Unicode
类以及基于文本或基于字符串的操作的本机String
编码。
答案 1 :(得分:4)
如上所述,.NET XML / Stream编写实现从已声明的XML编码以外的某处“拾取”或解释编码。我已成功测试了一个有效的解决方案,如前面Stackoverflow post
中包含的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());
我希望这有助于某人。
干杯
答案 2 :(得分:1)
我在某种程度上找不到任何可行的答案,所以这里有一个实际的解决方案,它会在标题中输出所需的编码:
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
。