从Feed中出现的奇怪的字符编码字符(?)

时间:2016-10-12 19:13:08

标签: c# xml xslt character-encoding

我有一个关于我正在做的XML feed和XSL转换的问题。在HTML页面上输出的feed的一些部分中,我会在页面上出现奇怪的字符(例如“”)。

Bad characters

在使用相同Feed的另一个网站(我不拥有)上,它没有获得这些字符。

No bad characters

这是我用来抓取并返回转换内容的代码:

string xmlUrl = "http://feedurl.com/feed.xml";
string xmlData = new System.Net.WebClient().DownloadString(xmlUrl);
string xslUrl = "http://feedurl.com/transform.xsl";
XsltArgumentList xslArgs = new XsltArgumentList();
xslArgs.AddParam("type", "", "specifictype");
string resultText = Utils.XslTransform(xmlData, xslUrl, xslArgs);
return resultText;

我的Utils.XslTransform函数看起来像这样:

static public string XslTransform(string data, string xslurl)
{
    TextReader textReader = new StringReader(data);
    XmlReaderSettings settings = new XmlReaderSettings();
    settings.DtdProcessing = DtdProcessing.Ignore;
    XmlReader xmlReader = XmlReader.Create(textReader, settings);
    XmlReader xslReader = new XmlTextReader(Uri.UnescapeDataString(xslurl));
    XslCompiledTransform myXslT = new XslCompiledTransform();
    myXslT.Load(xslReader);

    StringBuilder sb = new StringBuilder();
    using (TextWriter tw = new StringWriter(sb))
    {
        myXslT.Transform(xmlReader, new XsltArgumentList(), tw);
    }

    string transformedData = sb.ToString();
    return transformedData;
}

我对字符编码问题知之甚少,而且我一直试图把这个问题扼杀在一点时间,并且可以使用任何可能的建议。我不确定是否需要根据WebClient如何下载文件或XslTransform中的奇怪内容来改变。

谢谢!

3 个答案:

答案 0 :(得分:0)

尝试HtmlEncode。因此,在这种情况下,您将引用System.Web然后进行此更改(只需在最后一行调用HtmlEncode函数):

string xmlUrl = "http://feedurl.com/feed.xml";
string xmlData = new System.Net.WebClient().DownloadString(xmlUrl);
string xslUrl = "http://feedurl.com/transform.xsl";
XsltArgumentList xslArgs = new XsltArgumentList();
xslArgs.AddParam("type", "", "specifictype");
string resultText = Utils.XslTransform(xmlData, xslUrl, xslArgs);
return HttpUtility.HtmlEncode(resultText);

答案 1 :(得分:0)

字符â是UTF-8编码文本的多字节序列(marker)的标记,表示为ASCII。所以,我想,你用UTF-8生成一个HTML文件,而浏览器则解释它。我看到了两种解决方法:

  1. 最简单的解决方案是更新XSLT以包含HTML元标记,该标记将向浏览器提示正确的编码:<meta charset="UTF-8">
  2. 如果您的转换已经在元标记中定义了不同的编码并且您希望保留它,则需要在将XML保存为文件的函数中指定此编码。我假设此函数在您的示例中默认使用ASCII。如果您的XSLT配置为直接生成XML文件到磁盘,则可以使用XSLT指令<xsl:output encoding="ASCII"/>对其进行调整。

答案 2 :(得分:0)

要使用WebClient.DownloadString,您必须知道服务器将使用的编码,并事先告诉WebClient 这有点像Catch-22。

但是,没有必要这样做。使用WebClient.DownloadDataWebClient.OpenReader让XML库找出要使用的编码。

using (var web = new WebClient())
using (var stream = web.OpenRead("http://unicode.org/repos/cldr/trunk/common/supplemental/windowsZones.xml"))
using (var reader = XmlReader.Create(stream, new XmlReaderSettings { DtdProcessing = DtdProcessing.Parse }))
{
    reader.MoveToContent();
    //… use reader as you will, including var doc = XDocument.ReadFrom(reader);
}