非法 HTML 字符:十进制 141
Illegal HTML character: decimal 141
我们正在 Mac OS X 10.11 上使用 Saxon PE 9.5.1.8 处理 UTF-8 XML 输入文件。这是转换:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" version="5.0" encoding="utf-8"/>
<xsl:template match="/">
<html>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="a">
<p><xsl:sequence select="text()"/></p>
</xsl:template>
</xsl:stylesheet>
这是我们 XML 输入文件的 hexdump:
$ hexdump -C utf.xml
00000000 3c 3f 78 6d 6c 20 76 65 72 73 69 6f 6e 3d 22 31 |<?xml version="1|
00000010 2e 30 22 20 65 6e 63 6f 64 69 6e 67 3d 22 55 54 |.0" encoding="UT|
00000020 46 2d 38 22 3f 3e 0a 3c 72 6f 6f 74 3e 0a 3c 61 |F-8"?>.<root>.<a|
00000030 3e 30 78 43 32 42 35 3d 22 3c 21 5b 43 44 41 54 |>0xC2B5="<![CDAT|
00000040 41 5b c2 b5 5d 5d 3e 22 3c 2f 61 3e 0a 3c 61 3e |A[..]]>"</a>.<a>|
00000050 30 78 43 32 38 44 3d 22 3c 21 5b 43 44 41 54 41 |0xC28D="<![CDATA|
00000060 5b c2 8d 5d 5d 3e 22 3c 2f 61 3e 0a 3c 2f 72 6f |[..]]>"</a>.</ro|
00000070 6f 74 3e 0a |ot>.|
00000074
重要的字符是 (i) 00000040 行,0xC2B5 表示为 [..]
中的两个 .
字符,以及 (ii) 00000060 行,0xC28D 表示为 .
中的两个 .
字符[..]
.
中的字符
以下是如何从 *nix 命令生成我们的 XML 输入文件 shell:
echo '<?xml version="1.0" encoding="UTF-8"?>'
echo '<root>'
echo -e '<a>0xC2B5="<![CDATA[\xc2\xb5]]>"</a>' # micro sign
echo -e '<a>0xC28D="<![CDATA[\xc2\x8d]]>"</a>' # control character
echo '</root>'
我们的转换终止于:
SERE0014: Illegal HTML character: decimal 141"
十进制141是0x8D,也就是我们控制字符0xC28D的第二个字节。为什么 Saxon 会选择 0x8D 字符并将其视为无效?我们希望 Saxon 将其视为有效的 2 字节 UTF-8 字符 0xC28D 的字节 #2。
我们知道当我们可以用method="xml"
创建HTML;但是,这样做 (i) 不会发出我们致力于生成的 HTML5,并且 (ii) 从 HTML 输出中删除 0xC2 字节。
如果我理解正确,那么您想将 UTF-8 编码 XML 文档中的 Unicode 字符 UC28D
提供给 XSLT。据 https://dotnetfiddle.net/HuNLpC 告诉我,表示 UTF-8 中该字符的三字节序列是 EC 8A 8D
而不是您的十六进制转储包含的两字节序列 C2 8D
。所以我认为问题出在您的输入或输入生成上,它不包含分别为您的字符创建正确的 UTF-8 编码。
另请参阅我的评论,如果您使用 XML 字符引用,例如<root><a>0xC2B5="습"</a><a>0xC28D="슍"</a></root>
然后 Saxon(使用 9.5、9.6 和 9.7 进行测试)确实将带有样式表的输入转换为 HTML 文档,而不会抱怨任何错误或非法 HTML 字符。
我们正在 Mac OS X 10.11 上使用 Saxon PE 9.5.1.8 处理 UTF-8 XML 输入文件。这是转换:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" version="5.0" encoding="utf-8"/>
<xsl:template match="/">
<html>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="a">
<p><xsl:sequence select="text()"/></p>
</xsl:template>
</xsl:stylesheet>
这是我们 XML 输入文件的 hexdump:
$ hexdump -C utf.xml
00000000 3c 3f 78 6d 6c 20 76 65 72 73 69 6f 6e 3d 22 31 |<?xml version="1|
00000010 2e 30 22 20 65 6e 63 6f 64 69 6e 67 3d 22 55 54 |.0" encoding="UT|
00000020 46 2d 38 22 3f 3e 0a 3c 72 6f 6f 74 3e 0a 3c 61 |F-8"?>.<root>.<a|
00000030 3e 30 78 43 32 42 35 3d 22 3c 21 5b 43 44 41 54 |>0xC2B5="<![CDAT|
00000040 41 5b c2 b5 5d 5d 3e 22 3c 2f 61 3e 0a 3c 61 3e |A[..]]>"</a>.<a>|
00000050 30 78 43 32 38 44 3d 22 3c 21 5b 43 44 41 54 41 |0xC28D="<![CDATA|
00000060 5b c2 8d 5d 5d 3e 22 3c 2f 61 3e 0a 3c 2f 72 6f |[..]]>"</a>.</ro|
00000070 6f 74 3e 0a |ot>.|
00000074
重要的字符是 (i) 00000040 行,0xC2B5 表示为 [..]
中的两个 .
字符,以及 (ii) 00000060 行,0xC28D 表示为 .
中的两个 .
字符[..]
.
以下是如何从 *nix 命令生成我们的 XML 输入文件 shell:
echo '<?xml version="1.0" encoding="UTF-8"?>'
echo '<root>'
echo -e '<a>0xC2B5="<![CDATA[\xc2\xb5]]>"</a>' # micro sign
echo -e '<a>0xC28D="<![CDATA[\xc2\x8d]]>"</a>' # control character
echo '</root>'
我们的转换终止于:
SERE0014: Illegal HTML character: decimal 141"
十进制141是0x8D,也就是我们控制字符0xC28D的第二个字节。为什么 Saxon 会选择 0x8D 字符并将其视为无效?我们希望 Saxon 将其视为有效的 2 字节 UTF-8 字符 0xC28D 的字节 #2。
我们知道当我们可以用method="xml"
创建HTML;但是,这样做 (i) 不会发出我们致力于生成的 HTML5,并且 (ii) 从 HTML 输出中删除 0xC2 字节。
如果我理解正确,那么您想将 UTF-8 编码 XML 文档中的 Unicode 字符 UC28D
提供给 XSLT。据 https://dotnetfiddle.net/HuNLpC 告诉我,表示 UTF-8 中该字符的三字节序列是 EC 8A 8D
而不是您的十六进制转储包含的两字节序列 C2 8D
。所以我认为问题出在您的输入或输入生成上,它不包含分别为您的字符创建正确的 UTF-8 编码。
另请参阅我的评论,如果您使用 XML 字符引用,例如<root><a>0xC2B5="습"</a><a>0xC28D="슍"</a></root>
然后 Saxon(使用 9.5、9.6 和 9.7 进行测试)确实将带有样式表的输入转换为 HTML 文档,而不会抱怨任何错误或非法 HTML 字符。