【问题标题】:UTF-8 encoding issueUTF-8 编码问题
【发布时间】:2010-12-01 10:24:47
【问题描述】:

我正在尝试以 c# win 形式从 rss 提要(提要位置为 http://www.bgsvetionik.com/rss/ )获取数据。看看下面的代码:

public static XmlDocument FromUri(string uri) 
     {

        XmlDocument xmlDoc;
        WebClient webClient = new WebClient();

        using (Stream rssStream = webClient.OpenRead(uri))
        {
            XmlTextReader reader = new XmlTextReader(rssStream);
            xmlDoc = new XmlDocument();
            xmlDoc.XmlResolver = null;
            xmlDoc.Load(reader);
        }
        return xmlDoc;
   }

虽然 xmlDoc.InnerXml 包含使用 UTF-8 编码的 XML 定义,但我得到的是 š 而不是 š 等。

我该如何解决?

【问题讨论】:

    标签: c# xml encoding utf-8


    【解决方案1】:

    Feed 的数据不正确。 š 位于 CDATA section 内,因此 XML 解析器不会将其视为实体。

    如果您查看源 XML,您会发现实体和“原始”字符混合在一起,例如čišćenja 在第一个标题的中间。

    如果您需要更正该问题,您必须自己调用 Replace 来解决问题 - XML 解析器正在按照它的意图执行。

    编辑:对于替换,您可以获取所有 HTML 实体并一一替换它们,或者只是找出实际使用的实体。然后做:

    string text = element.Value.Replace("š", "š")
                               .Replace(...);
    

    当然,这意味着实际上正确转义的任何内容都应该真正是文本将被意外替换...但这就是数据损坏的问题:(

    【讨论】:

    • @Jon Skeet 很好的答案;你只是打败了我;-)。请原谅我在这里做了一些 SO.meta(我们可以在几分钟内删除这些 cmets),但我想知道您为什么在社区 wiki 中回复。我是 SO 新手,想知道该领域的区别/公认的做法。
    • 如果它不在 CDATA 部分中,由于 XML 不知道该实体指的是什么,它不会简单地出错吗?据我所知,XML 只能理解在 HTML 中工作的非常有限的实体子集。 RSS 提要通过在描述中包含 html 内容来滥用描述元素的情况并不少见。
    • +1,这就是 Hanselman 所说的“尖括号分隔”数据,而不是 XML。顺便说一句,为什么这是社区维基?
    • 谢谢乔恩!那么,解决它的唯一方法是制作一些 Replacer() 方法来替换 CDATA 部分中的所有数据?
    • @AnthonyWJones:我还没有检查实体是否被声明——但是,我同意这可能只是一个写得不好的提要。 @mvj/MarkJ:直到星期一我都有一个“代表假期”,我所有的帖子都是 CW 的。不用注意:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    • 2017-12-22
    • 2011-11-08
    • 2013-09-01
    相关资源
    最近更新 更多