【发布时间】:2016-02-23 12:17:46
【问题描述】:
我使用 .NET 类 XslCompiledTransform 进行 xslt 转换,但我遇到了编码问题。我的输入 xml 中有这个词 Förstelärare。以下是案例:
- 输入xml文件有
<?xml version="1.0" encoding="utf-8"?>- xslt文件有<xsl:output encoding="utf-8" ...- OK - 输入xml文件有
<?xml version="1.0" encoding="utf-8"?>- xslt文件有<xsl:output encoding="iso-8859-1" ...- OK - 输入xml文件有
<?xml version="1.0" encoding="iso-8859-1"?>- xslt文件有<xsl:output encoding="iso-8859-1" ...- OK - 输入 xml 文件有
<?xml version="1.0" encoding="iso-8859-1"?>- xslt 文件有<xsl:output encoding="utf-8" ...- 损坏 - 我在输出 xml 中看到 Förstelärare。
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);
}
输出.xml:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<test>Förstelärare</test>
为什么会这样?看起来我需要在我的 xslt 文件中使用 iso-8859-1 以防止损坏,因为它在 iso-8859-1 和 utf-8 两种情况下都有效。
【问题讨论】:
-
考虑展示最小但完整的 XML 输入、XSLT 代码和 .NET 代码示例,以便我们重现问题。
-
@MartinHonnen 添加了代码和xml。
-
我尝试在 .NET 4.6 控制台应用程序中重现该问题,使用 VS 2012,结果文档看起来不错:
<?xml version="1.0" encoding="utf-8" standalone="yes"?> <test>Förstelärare</test>。当您得到乱码的非 ASCII 字符时,您确定输入文件是正确的 ISO-8859-1 编码吗? -
你是如何创建输入文件的?
-
我将您显示的示例复制到 VS studio 中,并在 VS 中将编辑器窗格的编码设置为“西欧 (ISO)”并将其保存。
标签: c# xslt encoding utf-8 character-encoding