Чтение iso-8859-1 RSS-канал C # WP7 - PullRequest
4 голосов
/ 13 июня 2011

Я пытаюсь прочитать RSS-канал, который использует кодировку iso-8859-1.

Я могу получить все элементы в порядке, проблема в том, что когда я помещаю его в текстовый блок, он не будет отображать все символы. Я не уверен, что я делаю неправильно. Я пробовал несколько решений, которые я нашел в Google, но это не сработало для меня. Должно быть, я что-то упустил .. Это также первый раз, когда я действительно работаю с чем-то другим, кроме utf-16. Раньше мне никогда ничего не приходилось конвертировать.

Приложение работает следующим образом: я загружаю строку асинхронно (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;
    }

Хотя заголовки содержат символы, которые отображаются плохо. Как ... Я могу заставить кодировку работать частично. Вместо этих символов: квадрат с вопросительным знаком, вопросительный знак или одиночный квадрат.

Не поймите меня неправильно, я абсолютный новичок в этом. Но решения, опубликованные в Интернете, не решают его для меня.

Обратите внимание, что я удалил часть кодирования, потому что она не работала: / Если бы кто-нибудь смог мне помочь, это было бы удивительно.

Ответы [ 5 ]

3 голосов
/ 13 июня 2011

Вы можете указать кодировку, задав кодировку перед вызовом client.DownloadStringAsync:

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

В вашем примере кода вы нигде не создаете документ XML.Какой-то код отсутствует?Вы должны инициализировать его следующим образом:

var xml = XDocument.Load((string)args.Result);
2 голосов
/ 09 ноября 2012

Если это поможет, вы можете использовать:

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

Таким образом, каждый специальный символ будет декодирован, затем вы можете отобразить myString правильно

1 голос
/ 13 июня 2011

Windows Phone 7 и Silverlight не поддерживают другие кодировки, такие как ISO-8859-1, они поддерживают только кодеры ASCII и Unicode. Для всего остального вам нужно будет использовать OpenReadAsync, чтобы получить поток байтов, а затем применить свою собственную реализацию кодировки.

Этот блог может быть полезен при его создании.

0 голосов
/ 16 января 2012

Это сработало для меня, когда мне нужно было декодировать XML-файл rss.Он достаточно универсален, чтобы поддерживать все типы шифрования, поддерживаемые .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();
        }
0 голосов
/ 04 июля 2011

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). У меня была эта проблема в feed me (мое приложение 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

...