c# - 为什么 XmlReader 的默认编码与 XmlTextReader 的默认编码行为不同?

标签 c# xml character-encoding

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

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

  1. XmlReader.Create(new StreamReader(fileImport.FileContent, true));
  2. 新的 XmlTextReader(fileImport.FileContent)

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

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

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

XmlTextReader [msdn] XmlTextReader.Encoding property

StreamReader [msdn] StreamReader constructor

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

最佳答案

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

当您在 TextReader(例如 StreamReader)上创建一个 XmlReader 时,它总是使用 TextReader< 的编码(忽略 XML 声明中编码属性的值)。当您仅传递路径或流时,它会使用 XML 声明中的编码属性。

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

关于c# - 为什么 XmlReader 的默认编码与 XmlTextReader 的默认编码行为不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12325856/

相关文章:

c# - 如何克服从 API 中提取大型 xml 文档的 OutOfMemoryException?

c# - 控制 Unity 3D 游戏中广告之间的时间

java - Android - 使用 Xml 布局自定义对话框

mysql - R控制台中的错误字符编码

c# - 如何在Msbuild中使用Property函数找到当前工作目录盘符?

c# - 在 C# 中将字符串解析为 DateTime 对象

java - 带时间的日志文件名不能正常工作

java - 如何使用jackson将xml解析为json

java - HTML 编号不适用于注册商标符号

php - mysql文本中出现奇怪的字符