搞乱编码和XslCompiledTransform

4

我在处理编码问题。

一方面,我有一个URL以UTF-8响应(通过Firebug插件,我非常确定)。

使用以下代码打开URL并以UTF-8读取内容:

StreamReader reader = new StreamReader(response.GetResponseStream(),System.Text.Encoding.UTF8);

另外,我有一个包含以下代码的XSLT转换样式表:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
            <br/>
            hello
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

这个xslt文件也是以UTF-8格式保存的。

我使用以下代码将xml和xslt混合:

StringWriter writer = new StringWriter();
XslCompiledTransform transformer = new XslCompiledTransform();

transformer.Load(HttpContext.Current.Server.MapPath("xslt\\xsltsheet.xslt");  
XmlWriterSettings xmlsettings = new XmlWriterSettings();
xmlsettings.Encoding = System.Text.Encoding.UTF8;
transformer.Transform(xmlreader, null, writer);   

return writer;

然后在网页浏览器中渲染该作者的内容后,我遇到了以下错误:

The XML page cannot be displayed Cannot view XML input using style sheet. Please correct the error and then click the Refresh button, or try again later.

Switch from current encoding to specified encoding not supported. Error processing resource 'http://localhost:2541/Results....

<?xml version="1.0" encoding="utf-16"?>
我想知道在哪些地方考虑到了UTF-16编码,因为:
  • 我的所有文件都保存为UTF-8
  • 服务器的响应是UTF-8
  • 读取xslt表格的方式已配置为UTF-8。
任何帮助将不胜感激。
提前致谢。
最好的问候。
何塞。
2个回答

13

你的写入器正在将此内容写出,因为Encoding属性返回UTF-16编码。而不是使用StringWriter(在内存中为UTF-16),你可以初始化一个XmlTextWriter实例,使用UTF-8并使用MemoryStream作为后备存储。

编辑:解决这个问题的另一种方法是继承自StringWriter并重写Encoding属性以返回你喜欢的编码(例如,在你的情况下是UTF8)。这个想法来自Robert McLaws撰写的博客文章

public class UTF8StringWriter: StringWriter {
    public UTF8StringWriter() {}
    public UTF8StringWriter(IFormatProvider formatProvider): base(formatProvider) {}
    public UTF8StringWriter(StringBuilder sb): base(sb) {}
    public UTF8StringWriter(StringBuilder sb, IFormatProvider formatProvider): base(sb, formatProvider) {}

    public override Encoding Encoding {
        get {
            return Encoding.UTF8;
        }
    }
}

你在这个问题上并不孤单...例如,请参考MSDN社区评论(在底部)或以下的博客文章


4

尝试使用:

StringBuilder stringBuilder = new StringBuilder();
using (XmlWriter writer = XmlWriter.Create(stringBuilder, transformer.OutputSettings))
{
    xsl.Transform(xmlreader, writer);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接