XSL 转换:UTF-8 和 ISO-8859-1 兼容性

本文关键字:ISO-8859-1 兼容性 UTF-8 转换 XSL | 更新日期: 2023-09-27 18:35:53

我使用.NET class 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 文件有
  5. <?xml version="1.0" encoding="iso-8859-1"?> - XSLT 文件有<xsl:output encoding="utf-8" ... - 损坏 - 我在输出 xml 中看到 Förstel 很少见。

输入.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);
}

输出.xml:

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

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

XSL 转换:UTF-8 和 ISO-8859-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)之后,您应该看到0xF6它是否按照 XML 声明在 iso-8859-1 中 - 在这种情况下,您可能以错误的编码读取输出。如果是0xC3 0xB6,那就是 UTF-8,并且源的 XML 声明中的编码是错误的。