阅读iso-8859-1 RSS订阅C#WP7

问题描述:

我想读取使用iso-8859-1编码的rss订阅源。阅读iso-8859-1 RSS订阅C#WP7

我可以得到所有元素的罚款,问题是当我把它放在一个文本块,它不会显示所有字符。我不确定我做错了什么。我已经尝试了一些我在谷歌上找到的解决方案,但这对我并不适用。我必须错过一些东西......这也是我第一次真正使用utf-16以外的其他工具。我以前从来不需要转换任何东西。

该应用程序的工作原理如下I downloadstring async(WebClient)。所以当这被称为我得到一个字符串包含完整的RSS饲料。

我试着得到的字节,然后encoding.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; 
    } 

虽然标题中包含未显示任何良好的字符。喜欢..我可以得到编码部分工作。而不是有这些字符:带问号的方格,问号或单方格。

不要误会我我是一个总的初学者。但是发布在网上的解决方案并不能为我解决问题。

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

可以调用client.DownloadStringAsync之前通过设置编码指定编码:

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

在您的代码示例,你不要在任何地方创建XML文档。是否缺少一些代码?你应该像初始化:

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

对不起,我遗漏了一些代码。我确实指定了编码。而对于XML我这样做这样 XElement _xml; _xml = XElement.Parse(args.Result); – helpme 2011-06-13 12:16:47

+0

1.用完整的代码更新你的问题。 2.你确定返回的字符串是iso8559-1吗? – jgauffin 2011-06-13 12:22:27

+0

那么它在rss源文件中指定。所以我想是这样? – helpme 2011-06-13 12:28:17

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

这个blog可能会有助于你创建一个。

+0

我会发誓我遇到了MSDN上的文章,它被支持。至少它带有wp7标志。但因为我找不到它了,我会按照你的建议去阅读那个博客。如果能解决问题,我会通知你! – helpme 2011-06-13 12:38:07

+0

@helpme:查看我对@ jgauffin的答案的最新评论。 – AnthonyWJones 2011-06-14 07:56:41

ISO-8859-1绝对支持WP7。它是唯一一个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

需要到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(); 
     } 

如果有帮助支持的所有加密类型,你可以使用:

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

这样每一个特殊字符将解码,就可以显示myString正确