为什么xslt输出编码= utf-8不能转换iso-8859-1字符?

时间:2013-02-08 01:39:29

标签: xslt character-encoding

为什么在将输出编码设置为utf-8时,输出文件中的iso-8859-1字符未转换为utf-8?

我有一个iso-8859-1编码的xml输入文件,并声明了编码。我想用utf-8输出它。我的理解是在xslt文件中设置输出编码应该管理字符转换。

我的理解错了吗?如果没有,为什么以下简单测试用例在utf-8声明的输出文件中输出iso-8859-1字符?

我的输入文件如下所示:

<?xml version="1.0" encoding="ISO-8859-1"?>
<data>ö</data>

我的转换看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
    <xsl:output encoding="UTF-8" />
    <xsl:template match="/">
        <result>
            <xsl:value-of select="." />
        </result>
    </xsl:template>
</xsl:stylesheet>

在命令行中使用saxon9he,我的结果如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<result>ö</result>

根据BabelPad,我的结果文件中的ö是0xF6,这是一个无效的utf-8字符。 ö似乎没有受到转变的影响。

感谢您的帮助!

1 个答案:

答案 0 :(得分:5)

我可以看到两种可能的解释(认为可能还有其他解释)。

(a)序列化的最后阶段,即将字符转换为字节,不是由XSLT处理器完成的,而是由无法访问样式表的其他软件完成的。例如,如果您在将输出发送到Writer而不是OutputStream的Java应用程序中运行转换,则会发生这种情况 - Writer会使用平台默认编码将字符转换为字节,这可能是iso-8859-1。

(b)您在显示器中看到的八位字节不是存储在磁盘上的八位字节,而是它们的一些转换。将文件加载到编辑器中然后请求十六进制显示时会发生这种情况;在某些情况下,您将获得编辑器内存中文档表示的十六进制显示,而不是存储在磁盘上的内容。