4

我正在尝试阅读使用 iso-8859-1 编码的 rss 提要。

我可以让所有元素都很好,问题是当我将它放在文本块中时,它不会显示所有字符。我不确定我做错了什么。我尝试了一些在谷歌上找到的解决方案,但这对我不起作用。我一定是遗漏了一些东西。这也是我第一次真正使用除 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;
    }

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

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

请注意,我删除了编码部分,因为它不起作用:/如果有人能够帮助我,那就太棒了。

4

5 回答 5

3

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

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

在您的代码示例中,您不会在任何地方创建 XML 文档。是否缺少某些代码?您应该使用以下内容对其进行初始化:

var xml = XDocument.Load((string)args.Result);
于 2011-06-13T11:52:05.513 回答
2

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

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

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

于 2012-11-09T10:03:34.713 回答
1

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

这个博客可能对您创建一个有帮助。

于 2011-06-13T12:32:51.947 回答
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();
        }
于 2012-01-16T19:05:16.360 回答
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 控件,但这是我见过的唯一显示不正确的地方。

希望这会有所帮助,卡卢姆

于 2011-07-04T19:11:10.273 回答