【问题标题】:why does xslt output encoding=utf-8 not convert iso-8859-1 character?为什么 xslt output encoding=utf-8 不转换 iso-8859-1 字符?
【发布时间】:2013-01-23 17:38:45
【问题描述】:

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

感谢您的帮助!

【问题讨论】:

  • 我假设您正在使用库来处理 XLST 转换。提供该库以及与之交互的代码可能很有用。也许这是图书馆的一个设置。
  • 是什么让您认为ö 不是有效的UTF-8 字符?
  • @MadsHansen:你正在成为关卡错误的受害者。 UTF-8 不是一组字符,而是由 Unicode 和 ISO 10646 定义的通用字符集 (UCS) 中字符的编码。OP 并不是说​​ ö 不是合法的 字符但是 xF6 不是该字符或任何字符的合法 UTF-8 编码。在这一点上,OP 是完全正确的。
  • Fwiw,我希望任何 XSLT 处理器都能像您所说的那样运行。鉴于您使用的是 Saxon,我的第一反应是问:您确定在 Saxon 发出字符编码后,BabelPad 或其他任何东西都不会弄乱字符编码吗?我对 BabelPad 不熟悉 - 你确定你正确地解释了它告诉你的内容吗? hexdump 说什么? (当我在您的输入上运行 Saxon HE 时,hexdump 告诉我输入中的 ö 为 F6,输出中的为 C3 B6。)
  • 请使用浏览器(如谷歌浏览器)打开新的 xml 文件...您是否收到 xml 错误?如果 BabelPad 是对的,你应该看到 error on line 2 at column 9: Encoding error

标签: xslt character-encoding


【解决方案1】:

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

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

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

【讨论】:

  • 案例是b。我看到的是代码点 F6 的表示,而不是位值(编码)。转换中的编码工作正常。谢谢大家,您的帮助!
猜你喜欢
  • 2014-08-29
  • 1970-01-01
  • 1970-01-01
  • 2014-07-04
  • 2020-01-25
  • 2012-01-05
  • 2011-12-15
  • 2016-07-29
相关资源
最近更新 更多