2010-05-14 60 views
1

我发现了一个有趣的bug并想知道您的想法。简要背景:我写了一个自定义的DTD和一个示例XML文件(都是UTF-8)。我现在已经在Java中实现了一个我想测试的SAX解析器。我得到了一个SAXException抱怨“在公共标识符中找到了一个无效的XML字符(Unicode:0x7e)”。现在,我的DTD的URL确实包含一个波浪字符(unicode 0x7e)。如果我将DTD文件移动到另一个不包含代字号的URL,那么我的示例XML文件将解析而不会导致SAXException。Tilde在XML公共标识符中无法识别

所以我对这个问题的一个变通办法,但我想知道:为什么会发生这种情况?这是一个错误?如果是这样,它是UTF-8,Java(1.6.0_18 x86),Windows(Server 2008 R2 x86_64)还是什么?或者,这是XML 1.0规范中那些晦涩难懂的细节之一?

+1

不是一个*答案*(例如,我不知道是什么问题),但它肯定似乎按照规范要求(http://www.w3.org/TR/xml/#dt-sysid)。如果你逃脱它会发生什么(当你引用它时用%7e替换它)?我真的很惊讶,因为'〜'是URL的一个非常常见的字符,尤其是在大学等历史上。 – 2010-05-14 13:32:00

+0

谢谢你的回复。陌生感继续!如果我用%7e替换〜,它就可以工作。 所以〜被翻译为0x7e,解析器认为这是一个问题。但是明确插入0x7e被解析器接受。奇怪的。 – 2010-05-14 14:08:50

回答

3

你通常不会把一个URI(含有~与否)中的公共标识符。系统标识符通常是一个URI。

我怀疑你说:

<!DOCTYPE PUBLIC "http://www.example.com/~foo/x.dtd"> 

当你的意思是:

<!DOCTYPE SYSTEM "http://www.example.com/~foo/x.dtd"> 
+0

啊,非常感谢! – 2010-05-14 14:12:46

1

这是XML 1.0规范中一个不为人知的细微差别。我喜欢这句话!

我相信 “生产13” 在Extensible Markup Language (XML) 1.0 (Fifth Edition)

[13] PubidChar :: =#X20 | #xD | #xA | [a-zA-Z0-9] | [ - '()+,。/:=?;!*#@ $ _%]

定义了允许的字符集。

现在我已经看过T.J. Crowder的评论,我不确定这个答案是否正确。他引用的部分似乎并没有提到这条规则。

这个规格确实很难解开。