与Encoding和XslCompiledTransform混淆

Sos*_*osi 4 xml xslt httpwebrequest

我搞乱了编码.

一方面我有一个在UTF-8中响应我的网址(我非常肯定感谢firebug插件).

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

StreamReader reader = new StreamReader(response.GetResponseStream(),System.Text.Encoding.UTF8);
Run Code Online (Sandbox Code Playgroud)

另一方面,我有一个转换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>
Run Code Online (Sandbox Code Playgroud)

此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;
Run Code Online (Sandbox Code Playgroud)

然后毕竟我在webbrowser中呈现此作者的内容,我得到以下错误:

无法显示XML页面无法使用样式表查看XML输入.请更正错误,然后单击"刷新"按钮,或稍后重试.

从当前编码切换到不支持的指定编码.处理资源' http:// localhost:2541/Results ....时出错

<?xml version="1.0" encoding="utf-16"?>
Run Code Online (Sandbox Code Playgroud)

我想知道在哪里找到UTF-16编码需要计算:

  • 我的所有文件都保存为UTF-8
  • 服务器的响应是UTF-8
  • 读取xslt表的方式配置为UTF-8.

任何帮助,将不胜感激.

提前致谢.

最好的祝福.

何塞.

Luc*_*ero 9

由于该Encoding属性返回UTF-16编码,因此您的编写器会将其写出来.StringWriter您可以初始化XmlTextWriter实例以使用UTF-8 MemoryStream作为后备存储,而不是使用(内存中的UTF-16).

编辑:解决此问题的另一种方法是继承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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

您并不是唯一遇到此问题的人...请参阅MSDN社区评论(在底部)或以下博文.