2010-05-14 59 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的評論,我不確定這個答案是否正確。他引用的部分似乎並沒有提到這條規則。

這個規格確實很難解開。