在回答中这个问题,我遇到了一个我不明白的情况。 OP 尝试从以下位置加载 XML:
显而易见的解决方案是:
string m_strFilePath = "http://www.google.com/ig/api?weather=12414&hl=it";
XmlDocument myXmlDocument = new XmlDocument();
myXmlDocument.Load(m_strFilePath); //Load NOT LoadXml
然而这失败了
XmlException:给定编码中的字符无效。 1 号线,位置 499。
似乎被噎住了à
of Umidità
.
OTOH,以下工作正常:
var m_strFilePath = "http://www.google.com/ig/api?weather=12414&hl=it";
string xmlStr;
using(var wc = new WebClient())
{
xmlStr = wc.DownloadString(m_strFilePath);
}
var xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xmlStr);
我对此感到困惑。谁能解释为什么前者失败,但后者工作正常?
值得注意的是,文档的 xml 声明省略了编码。
The WebClient
使用 HTTP 响应标头中的编码信息来确定正确的编码(在本例中ISO-8859-1这是基于 ASCII 的,即每个字符 8 位)
看起来像XmlDocument.Load
不使用此信息,并且由于 xml 声明中也缺少编码,因此它必须猜测编码并得到错误的结果。经过一番研究,我相信它选择了 UTF-8。
如果我们想获得真正的技术性,它抛出的字符是“à”,在 ISO-8859-1 编码中是 0xE0,但这不是一个有效的字符UTF-8
- 具体来说,该字符的二进制表示形式是:
11100000
如果你在周围挖掘UTF-8 维基百科文章我们可以看到,这表示一个代码点(即字符),总共由 3 个字节组成,格式如下:
Byte 1 Byte 2 Byte 3
----------- ----------- -----------
1110xxxx 10xxxxxx 10xxxxxx
但如果我们回顾一下文档,接下来的两个字符是“:”,即 ISO-8859-1 中的 0x3A 和 0x20。这意味着我们最终得到的结果是:
Byte 1 Byte 2 Byte 3
----------- ----------- -----------
11100000 00111010 00100000
序列的第二个或第三个字节都没有10
作为两个最高有效位(表示连续),因此该字符在 UTF-8 中没有意义。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)