【问题标题】:XmlTextWriter default encoding behaves differently to setting encoding to UTF-8XmlTextWriter 默认编码的行为不同于将编码设置为 UTF-8
【发布时间】:2014-01-07 20:49:57
【问题描述】:

我看到 XmlTextWriter 出现一些我不希望出现的行为。当我通过任一方式实例化编写器时指定编码时

new XmlTextWriter(fs, Encoding.UTF8) 

XmlWriter.Create(fs, new XmlWriterSettings(){Encoding = Encoding.UTF8} )

生成的文档在文档开头有一个前导十六进制字符。由于我将 XML 传递给的 C++ 解析器无法读取此字符,因此我想避免使用此字符。有趣的是,当我创建这样的作家时

new XmlTextWriter(fs, null) 

我得到了我期望的确切行为。如何在不将参数留空的情况下在代码中重新创建此实例化?

【问题讨论】:

  • 仅供参考,您不应使用new XmlTextReader()new XmlTextWriter()。自 .NET 2.0 以来,它们已被弃用。请改用XmlReader.Create()XmlWriter.Create()
  • 什么是“前导十六进制字符”?我希望这是 byte order mark,当您指定 UTF-8 时它是有意义的。也许您的 C++ 解析器不知道如何解码 UTF-8?
  • 约翰,这就是问题的重点。我想使用 xmlWriter.Create() 但我无法获得与 new XmlTextWriter() 相同的行为
  • groverboy,我希望你是对的(我不确定)。但是(1)我无法控制C++解析器和(2)MSDN说在构造函数中传递null时使用的默认编码是UTF-8,所以我猜编码是正确的,我只是XmlWriter不指定第一个字符。

标签: c# xml encoding utf-8


【解决方案1】:

我认为“前导十六进制字符”是一个字节顺序标记 (BOM),正如我对您的问题所评论的那样,但如果没有实际看到它,我无法确定。 C++ 解析器似乎不知道 BOM,这很奇怪(参见 standard reference by Joel Spolsky)。

假设 C++ 解析器仅适用于编码为 UTF-8 或其字符子集(ASCII、ISO-8859-1 等)之一的 XML。在这种情况下,您别无选择,只能编码为 UTF-8 但排除 BOM。 XmlWriter 让你这样做:

var utf8NoBom = new UTF8Encoding(false);
var writer = XmlWriter.Create(fs, new XmlWriterSettings() { Encoding = utf8NoBom } );

以下引用来自XmlWriter.Create 上的 MSDN 参考:

XmlWriter 总是将字节顺序标记 (BOM) 写入底层数据流;但是,某些流不能有 BOM。要省略 BOM,请创建一个新的 XmlWriterSettings 对象并将 Encoding 属性设置为一个新的 UTF8Encoding 对象,并将构造函数中的布尔值设置为 false。

编辑:如果 C++ 解析器是通用 XML 解析器,那么它对 BOM 的无知是奇怪的。如果解析器是特定于域的,即,如果它总是与字符编码已知(并且明显受限)的文件一起使用,那么它的无知并不奇怪。我认为这是 Spolsky 的观点。

【讨论】:

    猜你喜欢
    • 2012-03-10
    • 2012-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-15
    • 1970-01-01
    • 2016-08-06
    • 2012-05-26
    相关资源
    最近更新 更多