【问题标题】:why does xmltextreader convert html encoded utf8 characters to utf8 string automatically?为什么 xmltextreader 会自动将 html 编码的 utf8 字符转换为 utf8 字符串?
【发布时间】:2010-07-22 11:18:37
【问题描述】:

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

在文件中(以及其他标签)我有<OtherText>Example "content" And ─</OtherText>

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

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

我尝试了以下方法:

  • 转换为字节并使用 Encoding.Convert 从 UTF-8 更改 进入 Latin-1 (成功 给我一堆“?”而是)
  • 使用 StreamReader(file,Encoding.随便) 将文件加载到 XmlTextReader

以及互联网和 StackOverflow istelf 上的几种变体和不同的方法。

我知道 .NET 字符串是 UTF-16,但我不明白为什么,当存在与旧数据库兼容的 UTF-8 字符和web(用于 HTML 标记等),它只是覆盖它并输出 UTF-8 编码的字符串 ANYWAY。

除了编写我自己的自定义文本解析器之外,没有办法解决这个问题???

【问题讨论】:

    标签: .net xml encoding xmltextreader


    【解决方案1】:

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

    问题是" 是一个 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);
    

    【讨论】:

    • 这很有意义。我盯着数据看了将近 12 个小时,却没有注意到!问题是数据是提供给我的,所以我无法对它进行任何更改,除非我写了一些东西来改变 & 符号的指示。让我震惊的是他们确实使用 &在文本中也是如此。然而,SecurityElement.Escape 似乎对 ─ 有效。它似乎没有发现它是 UTF-8 并将其作为 ASCII 处理,即使 MySQL 不同意。
    • 关闭,但没有雪茄。它仍然搞砸了像 ā 这样的字符(它被正确编码,除了,正如你所指出的,不是 &)所以 SecurityElement.Escape() 方法不起作用。似乎我必须自己做这件事,并且在此过程中不替换有效的 &'s。
    • 感谢这一观察以及上述方法的组合: Dim txt As New StreamReader(filepath) Dim memoryStream As New MemoryStream() Dim streamWriter As New StreamWriter(memoryStream) streamWriter.Write(txt .ReadToEnd.Replace("&", "&").Replace("&", "&")) streamWriter.Flush() memoryStream.Position = 0 Dim xml As New Xml.XmlTextReader(memoryStream) 我能成功写入数据!非常感谢您为我指明了正确的方向!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 2017-02-12
    • 1970-01-01
    • 2011-09-04
    • 2010-12-04
    相关资源
    最近更新 更多