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。以下是案例:
- 输入 XML 文件具有
<?xml version="1.0" encoding="utf-8"?>
- XSLT 文件具有<xsl:output encoding="utf-8" ...
- 正常 - 输入 XML 文件具有
<?xml version="1.0" encoding="utf-8"?>
- XSLT 文件具有<xsl:output encoding="iso-8859-1" ...
- 确定 - 输入 XML 文件具有
<?xml version="1.0" encoding="iso-8859-1"?>
- XSLT 文件具有<xsl:output encoding="iso-8859-1" ...
- 确定
输入 xml 文件有 <?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-1
和utf-8
两种情况下都有效。
您看到的输出是解释使用 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 声明中的编码是错误的。