2011-06-13 128 views
4

我想讀取使用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; 
    } 

雖然標題中包含未顯示任何良好的字符。喜歡..我可以得到編碼部分工作。而不是有這些字符:帶問號的方格,問號或單方格。

不要誤會我我是一個總的初學者。但是發佈在網上的解決方案並不能爲我解決問題。

請注意,我刪除了編碼部分,因爲它不工作:/ 如果有人能夠幫助我,這將是驚人的。

回答

3

可以調用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

1

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

0

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

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(); 
     } 
2

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

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

這樣每一個特殊字符將解碼,就可以顯示myString正確