为啥 XmlReader 中的默认编码与 XmlTextReader 默认编码的行为不同?

Posted

技术标签:

【中文标题】为啥 XmlReader 中的默认编码与 XmlTextReader 默认编码的行为不同?【英文标题】:Why Does The Default Encoding on XmlReader Behave Differently From XmlTextReader's Default Encoding?为什么 XmlReader 中的默认编码与 XmlTextReader 默认编码的行为不同? 【发布时间】:2012-09-01 19:04:33 【问题描述】:

我有一个 ACII 编码的 XML 文件。

我尝试使用两种不同的 Microsoft XmlReader 实现来阅读它:

    XmlReader.Create(new StreamReader(fileImport.FileContent, true)); new XmlTextReader(fileImport.FileContent)

第一个 XmlReader.Create 使用 StreamReader 进行编码,效果很好。

第二个,new XmlTextReader,抛出一个 XmlException 并带有消息“给定编码中的无效字符”。

如果您阅读了这两个的 MSDN 文档,它们都应该从字节顺序标记中检测编码,如果检测失败,则回退到 UTF-8。

XmlTextReader[msdn]

StreamReader[msdn]

那么,为什么 XmlTextReader 会失败,编码无效,而 StreamReader 却没有,当文档说默认情况下两种实现都以相同的方式处理编码时?

【问题讨论】:

【参考方案1】:

它们的工作方式相同,但您使用它们的方式不同...在第一种情况下,您将 StreamReader 作为参数传递,而在第二种情况下,您将传递文件位置。

当您在TextReader(例如StreamReader)上创建XmlReader 时,它始终使用TextReader 的编码(忽略XML 声明中编码属性的值)。当您只传递路径或流时,它使用 XML 声明中的 encoding 属性。

在您的情况下,我怀疑声明的编码与文件的实际编码不匹配。我能够通过创建一个 XML 文件来重现您的问题,该文件将其编码声明为 UTF-8,但实际上编码为 ANSI。如果文件包含非 ASCII 字符,我会得到同样的错误。但是,如果我修复 XML 声明中的编码,它就可以正常工作...

【讨论】:

感谢托马斯的回复。对声明的编码有很好的思考。星期一回到办公室时,我会仔细检查一下。 嗯...根节点上没有定义编码属性。我不确定 XmlTextReader 正在做什么来确定编码,但我将使用 StreamReader 实现运行。如果它再次破裂,可能会更明显问题是什么。谢谢。

以上是关于为啥 XmlReader 中的默认编码与 XmlTextReader 默认编码的行为不同?的主要内容,如果未能解决你的问题,请参考以下文章

如果没有空格分隔符,为啥 XmlReader 会跳过所有其他元素?

使用 PHP 和 XMLReader 解析 XML

保存到文件中的idea文件为啥是eclipse格式

为啥java的默认编码不是utf-8 而是gbk

依赖默认编码,我应该使用啥以及为啥?

当默认编码为 ASCII 时,为啥 Python 会打印 unicode 字符?