我正在尝试读取使用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;
}
虽然标题包含的字符也不能很好地显示。喜欢..我可以让编码部分工作。而不是这些字符:带有问号,问号或单个方格的正方形。
不要误会我的意思我是初学者。但是,已发布在网络上的解决方案并没有为我解决。
请注意,我删除了编码部分,因为它无法正常工作:/ 如果有人能够帮助我那将是惊人的。
答案 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)
尝试使用像这样的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();
}