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

时间:2009-10-09 11:57:43

标签: c# xml encoding linq-to-xml

为什么下面的代码没有设置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>

3 个答案:

答案 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