非法HTML字符:十进制141

时间:2015-12-29 20:32:07

标签: xml utf-8 xslt-2.0 saxon

我们正在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命令shell生成XML输入文件:

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字节。

1 个答案:

答案 0 :(得分:1)

如果我理解正确,那么您希望将UTF-8编码的XML文档中的Unicode字符void gift () { int i,j,m; int wrong=0; int k=0; char usern[50]; while(wrong==0) /* replace = by ==*/ { printf("Enter the username that you want to Gift:\n"); scanf("%s", usern); for (i=0; i<50; i++) { if (usern[i]==stoixeia[i][0]) { wrong=1; k=i; } } } m=strlen(usern); for(i=0; i<m; i++) { stoixeia[k][6]= stoixeia[k][6] + 10; } } 提供给XSLT。就https://dotnetfiddle.net/HuNLpC告诉我的而言,UTF-8中表示该字符的三字节序列是UC28D,而不是十六进制转储包含的两个字节序列EC 8A 8D。所以我认为问题在于您的输入或输入生成,它不包含分别为您的角色创建正确的UTF-8编码。

另请参阅我的评论,如果您使用XML字符引用,例如C2 8D然后Saxon(使用9.5,9.6和9.7测试)确实将带有样式表的输入转换为HTML文档,而不会抱怨任何错误或非法的HTML字符。