2013-04-24 104 views
0

我不明白爲什麼我們需要在DTD中使用!Entities,以及像HTML這樣的標記。爲什麼我們需要DTD和其他地方的「實體」

例如,我看到一個實體定義爲<!ENTITY copy "©">

如果我們可以清楚地使用©符號,爲什麼在標記中使用它時需要使用實體?爲什麼不直接按照我們在此處輸入的內容?

難道每個鍵盤上都沒有某些符號嗎?如果是這樣,那麼爲什麼每個鍵盤都帶有&符號時,我們都有一個&符號實體。

還有一個問題 - 在&符實體的定義中如何使用&號符號!

如果有人能爲我清除所有這些困惑,我會非常感激。

回答

2

瀏覽器實際上不讀取DTD。理論上,他們可以,而且他們在處理XML文檔時可能會這樣做,但HTML規範中的實體定義實際上只是一種描述瀏覽器應該知道的內容的方式,如內置。自然,XML處理器可能會讀取DTD,但我想這是一個不同的故事。

因此,這可以歸結爲爲什麼我們會使用實體參考&copy;。以下是可能的原因的列表:

  1. 當使用非Unicode字符編碼,你需要使用實體引用或字符引用(如&#xa9;)代表直接表示的範圍之外的所有字符。
  2. 您可能希望使用實體引用,因爲您沒有直接輸入字符的方便方法。很多時候,人們這樣做只是因爲他們無法學習輸入特殊字符的方式。
  3. 某些字符不可見或看起來像空間。字符串「1 234」(有一個不間斷的空格)通常以與「1 234」相同的方式顯示(具有正常空間),所以編寫1&nbsp;234會使得它更清晰,表示有一個不間斷空間。
  4. 某些字符很難與其他可能更常見的字符區分開來。你看到「 - 」和「 - 」之間的區別嗎?在HTML源代碼中使用&minus;&ndash;使差別更加突出。
  5. 幾個字符必須使用實體引用或字符引用編寫時,至少在某些條件下,它們將顯示爲數據字符。這適用於<&和(帶屬性值)到"'

關於&copy;,幾乎總是隻有理由2可能適用。

&符號有一個實體,因爲它打開了一個實體或字符引用,所以它本身在作爲數據字符使用時可能需要「確認」。在HTML規範,它被正式定義爲

<!ENTITY amp  CDATA "&#38;"> 

因此不存在歧義或死循環:實體,就像在HTML中定義的所有實體,字符引用,它使用數字進行定義。

+0

我以爲它被定義爲'<!ENTITY amp「&」>'? – CodyBugstein 2013-04-24 20:29:42

+0

@Imray,不,不是,請參閱http://www.w3.org/TR/html4/sgml/entities.html#h-24.4 – 2013-04-24 21:08:21

2

假設你想避免所有地方的醜陋CDATA部分,你需要一個實體<,因爲它在XML中有特殊的含義。鑑於您首先需要實體,並且他們以&開頭,您還需要一個實體。然後,您需要有一種方法將'"放入屬性值中,因此您至少需要其中一個實體。

除此之外,如果您需要使用只能傳輸Unicode子集的編碼傳輸數據,則可能需要實體(當然不一定命名,數字就可以)。 Unicode編碼(例如UTF-8)在您可以使用時很棒,但在「真實世界」中可能並不總是一種選擇。

然後,實體並不一定代表單個字符。例如,您可以通過在DTD中定義它們,並在文件本身中添加&legalBlurp;&logo;,讓您的XML文件包含您一遍又一遍的某些文本塊。將這種信息放在一個地方進行更改是件好事。