【问题标题】:Why can't I set the XDocument XDeclaration encoding type to iso-8859-1?为什么我不能将 XDocument XDeclaration 编码类型设置为 iso-8859-1?
【发布时间】:2009-10-09 11:57:42
【问题描述】:

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

【问题讨论】:

  • 检查您正在使用的TextWriter 的编码。见here。如果上面的链接不起作用,Google cache version 可能仍然可用here

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


【解决方案1】:

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

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

【讨论】:

  • 这是否意味着无法使用 XDocument 指定无效编码?我将 XML 提交给需要不正确声明的第三方 .
  • 我相信你可以。有哪些系统符合正确的用法、语言和规范?
【解决方案2】:

如前所述,.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());

我希望这对某人有所帮助。

干杯

【讨论】:

    【解决方案3】:

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

        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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多