XSL转换:utf-8和iso-8859-1兼容性

时间:2016-02-23 12:17:47

标签: c# xslt encoding utf-8 character-encoding

我使用.NET类XslCompiledTransform进行xslt转换,我遇到编码问题。我的输入xml中有Förstelärare这个词。以下是案例:

  1. 输入xml文件有<?xml version="1.0" encoding="utf-8"?> - xslt文件有<xsl:output encoding="utf-8" ... - 确定
  2. 输入xml文件有<?xml version="1.0" encoding="utf-8"?> - xslt文件有<xsl:output encoding="iso-8859-1" ... - 确定
  3. 输入xml文件有<?xml version="1.0" encoding="iso-8859-1"?> - xslt文件有<xsl:output encoding="iso-8859-1" ... - 确定
  4. 输入xml文件有<?xml version="1.0" encoding="iso-8859-1"?> - xslt文件有<xsl:output encoding="utf-8" ... - 已损坏 - 我在输出xml中看到Förstelärare。< / LI>

    input.xml中:

    <?xml version="1.0" encoding="iso-8859-1"?>
    <test>Förstelärare</test>
    

    trans.xslt:

    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output method="xml" version="1.0" encoding="utf-8" standalone="yes" indent="yes"/>
        <xsl:template match="/"> 
            <xsl:apply-templates select="/test" />
        </xsl:template>
        <xsl:template match="test">
            <test><xsl:value-of select="text()"/></test>
        </xsl:template>
    </xsl:stylesheet>
    

    C#代码:

    var xslCompiledTransform = new XslCompiledTransform();
    using (var xmlReader = XmlReader.Create(@"C:\trans.xslt", new XmlReaderSettings { DtdProcessing = DtdProcessing.Ignore, XmlResolver = null }))
    {
        xslCompiledTransform.Load(xmlReader);
    }
    using (var xmlReader = XmlReader.Create(@"C:\input.xml", new XmlReaderSettings { DtdProcessing = DtdProcessing.Ignore, XmlResolver = null }))
    using (var xmlWriter = XmlWriter.Create(@"C:\output.xml", xslCompiledTransform.OutputSettings))
    {
        xslCompiledTransform.Transform(xmlReader, xmlWriter);
    }
    

    的Output.xml:

    <?xml version="1.0" encoding="utf-8" standalone="yes"?>
    <test>Förstelärare</test>
    

    为什么会这样?看起来我需要在我的xslt文件中使用iso-8859-1来防止损坏,因为它在iso-8859-1utf-8两种情况下均有效。

1 个答案:

答案 0 :(得分:1)

您看到的输出是解释用UTF-8编码的字符串的结果,就像它是iso-8859-1一样。

有两种可能性:

  • 您的源文件实际上编码为UTF-8:只是因为XML声明显示iso-8859-1,这并不一定意味着文本的保存方式。 (编辑:基于评论,我相信这就是你的情况。)
  • 或者,当你把它写成UTF-8时,它工作正常,但无论你用什么来检查输出都忽略了它并假设它是iso-8859-1。

这是其中各种编码的字符: http://www.fileformat.info/info/unicode/char/00f6/index.htm

我建议在十六进制编辑器中查看源文档,然后立即跟随'F'(任何编码中的70或0x46),如果符合XML声明,它应该在iso-8859-1中看到0xF6-在这种情况下,您可能正在以错误的编码读取输出。如果它是0xC3 0xB6,那是UTF-8,并且源的XML声明中的编码是错误的。