为何XML Lint与W3Schools验证器对十六进制Unicode码点判定不同?
XML验证器对含非打印字符XML的判定差异解析
问题场景
测试的XML代码如下:
<?xml version="1.0" encoding="UTF-8"?> <Response> <Data> <ID></ID> </Data> </Response>
其中对应Unicode码点U+0014(十进制20),属于非打印控制字符。两款工具给出完全相反的判定:
- XML Lint判定该XML有效
- W3Schools XML验证器判定该XML无效
差异根源
问题出在两款工具默认遵循的XML版本规范不同:
- XML 1.0与XML 1.1的控制字符规则差异
- XML 1.0(第三版及更早)严格禁止大部分ASCII控制字符(U+0000到U+001F),仅允许制表符
\t、换行\n、回车\r三个例外,U+0014属于被禁止的范围。 - XML 1.1放宽了限制,允许除U+0000之外的所有控制字符,不管是直接编码还是通过字符引用(比如
)的形式出现都合法。
- XML 1.0(第三版及更早)严格禁止大部分ASCII控制字符(U+0000到U+001F),仅允许制表符
- 工具的规范默认选择
- W3Schools验证器默认采用XML 1.0规范,因此会把包含
U+0014的XML判定为无效。 - XML Lint默认可能启用了XML 1.1模式,或者对XML 1.0的实现更宽松,因此认可这份XML的有效性。
- W3Schools验证器默认采用XML 1.0规范,因此会把包含
该采信哪一方?
取决于你的实际使用场景:
- 如果面向通用XML解析环境(比如多数浏览器、旧版解析器),必须遵循XML 1.0规范,不能使用
U+0014这类控制字符,此时要采信W3Schools的结果。 - 如果系统明确使用支持XML 1.1的解析器,则可以保留该字符,XML Lint的判定是合理的。
另外,换成十进制的本质还是同一个字符,只要遵循的规范版本不变,判定结果也不会改变。
内容的提问来源于stack exchange,提问作者The Welder
相关产品推荐
相关产品推荐

