我使用.NET类XslCompiledTransform进行xslt转换,我遇到编码问题。我的输入xml中有Förstelärare这个词。以下是案例:
<?xml version="1.0" encoding="utf-8"?>
- xslt文件有<xsl:output encoding="utf-8" ...
- 确定 <?xml version="1.0" encoding="utf-8"?>
- xslt文件有<xsl:output encoding="iso-8859-1" ...
- 确定 <?xml version="1.0" encoding="iso-8859-1"?>
- xslt文件有<xsl:output encoding="iso-8859-1" ...
- 确定 <?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-1
和utf-8
两种情况下均有效。
答案 0 :(得分: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声明中的编码是错误的。