【发布时间】: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