5

为什么将输出编码设置为 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 字符。ö 似乎没有受到转换的影响。

谢谢你的帮助!

4

1 回答 1

5

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

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

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

于 2013-02-08T08:05:12.137 回答