【问题标题】:Messing with Encoding and XslCompiledTransform混淆编码和 XslCompiledTransform
【发布时间】:2023-03-18 04:41:01
【问题描述】:

我弄乱了编码。

一方面,我有一个以 UTF-8 响应我的 url(我很确定感谢 firebug 插件)。

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

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;

然后我在浏览器中渲染了这个作家的内容,我得到了以下错误:

无法显示 XML 页面 无法使用样式查看 XML 输入 床单。请更正错误并 然后单击刷新按钮,或尝试 稍后再来。

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

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

我想知道在哪里可以找到 UTF-16 编码:

  • 我所有的文件都保存为 UTF-8
  • 来自服务器的响应是 UTF-8 格式
  • xslt sheet 的读取方式配置为 UTF-8。

任何帮助将不胜感激。

提前致谢。

最好的问候。

何塞。

【问题讨论】:

    标签: xml xslt httpwebrequest


    【解决方案1】:

    由于Encoding 属性返回 UTF-16 编码,因此您的编写器导致它被写出。除了使用StringWriter(内存中的UTF-16)之外,您还可以初始化XmlTextWriter 实例以使用带有MemoryStream 的UTF-8 作为后备存储。

    编辑:解决此问题的另一种方法是从 StringWriter 继承并覆盖 Encoding 属性以返回您喜欢的编码(例如,在您的情况下为 UTF8)。这个想法来自blog post written by 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 community comment(在底部)或下面的blog post

    【讨论】:

      【解决方案2】:

      尝试使用:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-27
        • 2011-12-17
        • 2013-07-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多