我有一个UTF-8编码的xml
<?xml version="1.0" encoding="UTF-8"?>
使用以下版本的xml阅读器时。我假设这使用UTF-8编码来解析xml文件。
using (XmlReader reader = XmlReader.Create(inputUri))
我正处于异常之下。
System.Xml.XmlException occurred
HResult=-2146232000
LineNumber=18750
LinePosition=13
Message=Invalid character in the given encoding. Line 18750, position 13.
但是在使用xmlreader的以下版本时
using (XmlReader reader = XmlReader.Create(new StreamReader(inputUri,Encoding.UTF8)))
成功解析xml。为什么这两个版本之间的这些差异都使用相同的编码来解析给定的xml文件?
PS:我非常确定第一个版本使用UTF-8编码。
以下是 XmlTextReaderImpl.cs 的摘录,其实例由第一个版本返回。
private void SetupEncoding( Encoding encoding ) {
if ( encoding == null ) {
Debug.Assert( ps.charPos == 0 );
ps.encoding = Encoding.UTF8;
ps.decoder = new SafeAsciiDecoder(); // This falls back to UTF-8 decoder
}
}
答案 0 :(得分:1)
我在msdn forum得到了答案。
“XmlReader会将任何非法字符标记为非法,因为XML格式已损坏。
在第二种情况下,由于StreamReader是通用文本阅读器,当遇到不在编码范围内的数据时,它会用replacement fallback替换该字符。因此,当您将结果流传递给XmlReader时,它现在可以看到的所有字符都落在由编码定义的合法范围内。“
答案 1 :(得分:0)
using (XmlReader reader = XmlReader.Create(inputUri))
以上将使用XmlReader
的编码,并将忽略文件的编码声明。
这就是出现异常的原因,也就是第二种方法有效的原因 - 因为您提供了UTF-8
编码来使用。
N.B。我认为默认编码是UTF-16