RSS Reader(WebClient / XmlTextReader)以某种方式使用错误的编码 - 包括失败的单元测试

时间:2014-09-09 15:52:08

标签: c# encoding rss xmlreader

我有一个rssReader在一些rss feed上正常工作,但我得到了一个我特别的丹麦字符有一些问题 - 编码我期望。

我在这个url的原始Http响应中看到了这个编码: http://www.sydvestjyllandsefterskole.dk/rss

Content-Type: text/xml; Charset=UTF-8 
<?xml version="1.0" encoding="iso-8859-1" ?>

尝试了这两种编码和其他编码,但似乎没有任何效果。

我做了一个单元测试来显示问题和我尝试过的东西:( NUnit)

public IEnumerable<TestCaseData> RssItemEncodingTestCases
{
    get
    {
        yield return new TestCaseData("http://www.sydvestjyllandsefterskole.dk/rss", "Stort fremmøde til dejlig familiedag.", new ASCIIEncoding());
        yield return new TestCaseData("http://www.sydvestjyllandsefterskole.dk/rss", "Stort fremmøde til dejlig familiedag.", new UTF8Encoding());
        yield return new TestCaseData("http://www.sydvestjyllandsefterskole.dk/rss", "Stort fremmøde til dejlig familiedag.", new UnicodeEncoding());
        yield return new TestCaseData("http://www.sydvestjyllandsefterskole.dk/rss", "Stort fremmøde til dejlig familiedag.", Encoding.GetEncoding("ISO-8859-1"));
    }
}

[TestCaseSource("RssItemEncodingTestCases")]
public void TestEncoding(string url, string expectedToStartWith, Encoding encoding)
{
    var description = Read(url, encoding);

    Assert.That(description, Is.StringStarting(expectedToStartWith));
}

public string Read(string url, Encoding encoding = null)
{
    var client = new WebClient();
    if (encoding != null)
        client.Encoding = encoding;
    try
    {
        using (XmlReader reader = new XmlTextReader(client.OpenRead(url)))
        {
            while (reader.Read())
            {
                if (reader.IsStartElement() & reader.Name == "item")
                {
                    while (reader.Read())
                    {
                        switch (reader.Name)
                        {
                            case "description":
                                return reader.ReadElementContentAsString();
                        }
                        if (reader.Name == "item" & reader.NodeType == XmlNodeType.EndElement)
                            break;
                    }
                }
            }
        }
    }
    catch
    {

    }
    return null;
}
  

预期:字符串以“Stortfremmødetildejlig familiedag”开头。   但是:“Stortfremmødetildejlig familiedag。

知道如何正确解码?

1 个答案:

答案 0 :(得分:0)

通过将RSS源的编码更改为utf-8来修复它:

<?xml version="1.0" encoding="utf-8" ?>