为什么xmltextreader会自动将html编码的utf8字符转换为utf8字符串?

时间:2010-07-22 11:18:38

标签: .net xml encoding xmltextreader

我收到一个编码为“ISO-8859-1”(Latin-1)

的XML文件

在文件(以及其他标签)中,我有<OtherText>Example &quot;content&quot; And &#9472;</OtherText>

现在出于某种原因,当我将其加载到XMLTextReader并执行“XmlReader.Value”以返回值时,它返回:“content”和─

然后,当遇到只接受Latin-1编码的数据库时,显然会出现错误。

我尝试了以下内容:

  • 转换为字节并使用 Encoding.Convert从UTF-8改变 成为Latin-1(成功 给了我一堆“?”代替)
  • 使用 的StreamReader(文件,编码任何) 将文件加载到XmlTextReader

互联网和StackOverflow上的几种不同的方法和不同的方法。

我理解.NET字符串是UTF-16,但我不明白为什么,一个完全Latin-1格式的XML文件,带有CORRECT标记,用于存在与旧数据库兼容的UTF-8字符和web(用于HTML标记等),它只是覆盖它并输出UTF-8编码的字符串ANYWAY。

现在除了编写我自己的自定义文本解析器之外还有其他解决方法吗?

1 个答案:

答案 0 :(得分:3)

我不相信这是编码的问题。您所看到的是未转义的XML字符串。

问题是&quot;是XML转义字符,因此XMLTextReader将为您取消转义。

如果你改变了这个:

<OtherText>Example &quot;content&quot; And &#9472;</OtherText>

对此:

<OtherText>Example &amp;quot;content&amp;quot; And &amp;#9472;</OtherText>

然后

   XmlReader.Value = "&quot;content&quot; And &#9472;";

您需要将您的值包装在CDATA中,以便解析器忽略它。

另一种选择是重新转义字符串:

    using System.Security;
....
....
    string val = SecurityElement.Escape(xmlReader.Value);