阅读iso-8859-1 rss feed C#WP7

时间:2011-06-13 11:44:31

标签: c# windows-phone-7 encoding rss iso-8859-1

我正在尝试读取使用iso-8859-1编码的rss源。

我可以将所有元素都搞定,问题是当我把它放在一个文本块中时它不会显示所有字符。我不确定我做错了什么。我尝试了一些我在谷歌上找到的解决方案,但这对我不起作用。我一定是错过了什么......这也是我第一次真正使用utf-16以外的任何东西。我之前从未改变任何东西。

该应用程序的工作原理如下我是downloadstring async(WebClient)。因此,当调用它时,我会得到一个包含完整rss feed的字符串。

我尝试过获取字节,然后编码.convert ..但我必须遗漏一些东西。

像这是一个样本

        WebClient RSS = new WebClient();
        RSS.Encoding = Encoding.GetEncoding("ISO-8859-1");
        RSS.DownloadStringCompleted += new         DownloadStringCompletedEventHandler(RSS_DSC);
        RSS.DownloadStringAsync(new Uri("some rss feed"));


public void RSS_DSC(object sender, DownloadStringCompletedEventArgs args)
    {

        _xml = XElement.Parse(args.Result);
        foreach(XElement item in _xml.Elements("channel").Elements("item"))
                {
                   feeditem.title = item.Element("title").Value;
                      // + all other items 

                }
    } 

我已经尝试了这个以及

private void RSS_ORC(object sender, OpenReadCompletedEventArgs args)
    {
        Encoding e = Encoding.GetEncoding("ISO-8859-1");

        Stream ez = args.Result;

        StreamReader rdr = new StreamReader(ez, e);
        XElement _xml = _xml = XElement.Parse(rdr.ReadToEnd());
        feedlist = new List<Code.NewsItem>();

        XNamespace dc = "http://purl.org/dc/elements/1.1/";
        foreach (XElement item in _xml.Elements("channel").Elements("item"))
        {

            Code.NewsItem feeditem = new Code.NewsItem();
            feeditem.title = item.Element("title").Value;
            feeditem.description = item.Element("description").Value;
            feeditem.pubdate = item.Element("pubDate").Value;
            feeditem.author = item.Element(dc + "creator").Value;

            feedlist.Add(feeditem);
        }
        listBox1.ItemsSource = feedlist;
    }

虽然标题包含的字符也不能很好地显示。喜欢..我可以让编码部分工作。而不是这些字符:带有问号,问号或单个方格的正方形。

不要误会我的意思我是初学者。但是,已发布在网络上的解决方案并没有为我解决。

请注意,我删除了编码部分,因为它无法正常工作:/ 如果有人能够帮助我那将是惊人的。

5 个答案:

答案 0 :(得分:3)

您可以在调用client.DownloadStringAsync之前设置编码来指定编码:

webClient.Encoding = Encoding.GetEncoding("iso-8859-1")

在您的代码示例中,您不会在任何地方创建XML文档。有些代码丢失了吗?您应该使用以下内容对其进行初始化:

var xml = XDocument.Load((string)args.Result);

答案 1 :(得分:2)

如果有帮助,您可以使用:

    var myString = HttpUtility.HtmlDecode(feeditem.description);

这样每个特殊字符都会被解码,然后你可以正确显示myString

答案 2 :(得分:1)

Windows Phone 7和Silverlight不支持其他编码,例如ISO-8859-1,它们仅支持ASCII和Unicode编码器。对于其他任何事情,您需要使用OpenReadAsync来获取字节流,然后应用您自己的编码实现。

blog可能对您有所帮助。

答案 3 :(得分:0)

WP7最支持ISO-8859-1。它是ISO-8859- *编码中唯一的编码。我使用XmlReader来反序列化RSS流,UTF- *和ISO-8859-1是该类支持的唯一编码(Windows-*和ISO-8859-2及以上在XmlReader c'tor中抛出异常)。

尝试使用像这样的XmlReader(不指定编码):

 using (XmlReader reader = XmlReader.Create(stream))
 {
     ...
 }

XmlReader将从流中的xml声明中获取编码。

显示字符的上半部分(0x80以上)可能仍有问题。我有这个问题喂我(我的WP7应用程序)并使用这个小黑客来解决问题:

    public static string EncodeHtml(string text)
    {
        if (text == null) return string.Empty;

        StringBuilder decodedText = new StringBuilder();
        foreach (char value in text)
        {
            int i = (int)value;
            if (i > 127)
            {
                decodedText.Append(string.Format("&#{0};", i));
            }
            else
            {
                decodedText.Append(value);
            }
        }
        return decodedText.ToString();
    }

它当然只适用于WebBrowser控件,但这是我见过不正确显示的唯一地方。

希望这有帮助, Calum

答案 4 :(得分:0)

当需要解码rss xml时,这对我有用。它足够通用,因此它将支持.NET支持的所有加密类型

        WebClient wcRSSFeeds = new WebClient();
        String rssContent;

        // Support for international chars
        Encoding encoding = wcRSSFeeds.Encoding;
        if (encoding != null)
        {
            encoding = Encoding.GetEncoding(encoding.BodyName);
        }
        else
        {
            encoding = Encoding.UTF8;  // set to standard if none given 
        }
        Stream stRSSFeeds = wcRSSFeeds.OpenRead(feedURL); // feedURL is a string eg, "http://blah.com"

        using (StreamReader srRSSFeeds = new StreamReader(stRSSFeeds, encoding, false))
        {
            rssContent = srRSSFeeds.ReadToEnd();
        }