为什么是一个HTML元素而不是一个HTML实体?

时间:2010-08-15 16:24:36

标签: html

为什么呢? &br;之类的东西不合适吗?

8 个答案:

答案 0 :(得分:32)

HTML实体引用取决于HTML版本,SGML实体或XML实体(HTML从底层技术继承实体)。实体是一种在文档中插入其他地方定义的内容块的方法。

所有HTML实体都是单字符实体,因此与字符引用基本相同(从技术上讲,它们与字符引用不同,但由于没有定义多字符实体,因此区别对HTML没有影响)。

当HTML处理器看到时,例如—它会将该实体引用的内容替换为适当的实体,具体取决于DTD中的部分:

<!ENTITY mdash   CDATA "&#8212;" -- em dash, U+2014 ISOpub -->

因此,它将实体引用替换为实体&#8212;,而实体又是由字符<br/>(U + 2014)替换的字符引用。实际上,除非您使用不直接理解HTML的通用XML或SGML处理器,否则这将真正完成一步。

现在,我们将取代您的假设&amp; br;导致换行发生?我们不能使用换行符,或者甚至是鲜为人知的U + 2028 LINE SEPARATOR(在纯文本中的语义与HTML中的<br/>具有相同的含义),因为它们是空白字符并不重要在大多数HTML代码中,您应该感激的是,如果我们无法在源代码中格式化可读性,那么编写HTML会更加困难。

我们需要的不是实体,而是一种在语义上指示呈现的内容在此时包含换行符的方法。我们还需要不指出任何其他内容(我们已经可以通过开始或结束块元素来指示换行符,但这不是我们想要的)。唯一合理的方法是使一个元素具有完全相同的元素,因此我们有{{1}}元素,其相关标记被放入源代码中。

答案 1 :(得分:21)

标签和字符实体引用存在的原因各不相同 - 字符实体是某些字符的替身(有时需要作为转义序列 - 例如&amp;的&符号&),标签是那里有结构。

<br>标记存在的原因是HTML崩溃了空格。需要有一种方法来指定硬换行符 - 具有的地方有换行符。这是<br>标记的功能。

虽然U+2028 LINE SEPARATOR具有相似的含义,但没有单个字符具有此含义,即使它被使用也无济于事,因为它被认为是空白而HTML会崩溃它。

有关此方面的详细信息,请参阅@John Kugelman@John Hanna的答案。


不完全相关,还有另一个原因导致&br;字符实体引用不存在:以一种可能有多个字符的方式定义换行符,请参阅HTML 4 spec

  

换行符定义为回车符(&#x000D;),换行符(&#x000A;)或回车符/换行符对。

字符实体是单字符转义符,因此无法再代表HTML 4 spec

  

字符实体引用是引用文档字符集字符的SGML构造。

您将看到所有已定义的字符实体都映射到单个字符。换行符/换行符不能以这种方式干净地映射,因此需要实体而不是字符实体引用。

这就是为什么换行符不能用字符实体引用来表示。

无论如何,只需使用 Enter 键插入换行符就不需要了。

答案 2 :(得分:9)

实体是其他字符或文本位的替身。在HTML中,它们用于表示难以输入的字符(例如{ - 1}}表示“ - ”)或需要转义的字符(&mdash;表示“&amp;”)。假设的&amp;实体代表什么?

它不能是&br;\r\n,因为这些已经很容易输入(只需按Enter键)。您尝试解决的问题是 HTML在大多数情况下折叠空白并将换行视为空格。也就是说,\r\n不是换行符,它只是像制表符和空格一样的空格。

实体\n必须由其他一些文本替换。你用什么角色来代表“硬线突破”的概念?标准换行符&br;恰好是正确的字符,但不幸的是它不适合,因为它被抛入通用的“空白”桶中。您必须重载某些其他控制字符以表示“硬线断开”,或使用某些扩展的Unicode字符。当HTML被设计时,Unicode只是一个新兴的,仍在开发的标准,所以这不是一个选择。

\n元素是一种简单,直接的方法,可以将“强硬换行”的概念添加到文档中,因为没有字符可以表示该概念。

答案 3 :(得分:6)

在HTML中,所有line breaks都被视为空格:

  

换行符定义为回车符(&#x000D;),换行符(&#x000A;)或回车符/换行符对。所有换行符都构成了空格。

并且white space只会分隔单词并且空格序列会崩溃:

  

对于除PRE之外的所有HTML元素,空格序列将“单词”分开(我们在这里使用术语“单词”表示“非空白字符序列”)。 [...]

     

[...]

     

请注意,源文档中单词之间的一系列空格可能会导致呈现的字间距完全不同(PRE元素除外)。特别是,用户代理应在生成输出字间空间时折叠输入空格序列。 [...]

这意味着换行符不能用普通字符表示。虽然Unicode中有某些特殊字符可以明确地分隔行和段落,但它们也没有指定在HTML中执行此操作:

  

请注意,尽管[ISO10646]中定义了&#x2028;&#x2029;以分别明确地分隔行和段落,但这些不构成HTML中的换行符[...]

这意味着没有普通字符或普通字符序列来标记HTML中的换行符。这就是为什么有BR element

现在,如果您想使用&br;而不是<br>,则只需要声明实体 br 来表示值<br>

<!ENTITY br "<br>">

声明了这个名为 br 的附加实体,通用XML或SGML处理器将用它所代表的值替换实体引用&br;的每一次出现(<br> )。示例文档:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
   "http://www.w3.org/TR/html4/strict.dtd" [
   <!ENTITY br "<br>">
]>
<HTML>
   <HEAD>
      <TITLE>My first HTML document</TITLE>
   </HEAD>
   <BODY>
      <P>Hello &br;world!
   </BODY>
</HTML>

答案 4 :(得分:3)

实体是内容,标签是结构或布局(非常粗略地说)。似乎无论谁制作<br>标签都认为断线更多地与结构和布局有关而不是与内容有关。无法真正“看到”<br>  我倾向于同意。哦,我正在努力做到这一点,所以随意不同意;)

答案 5 :(得分:3)

HTML是一种标记语言 - 它表示文档的结构,而不是文档应该如何直观显示。以<EM>标记为例 - 它告诉用户代理他们应该强调放在开始和结束<EM>标记之间的任何文本。但是,状态如何应该表示强调。是的,大多数可视化Web浏览器都会将文本放在斜体中,但这只是惯例。其他浏览器(例如单色纯文本浏览器)可以反向显示文本。屏幕阅读器可能会以更响亮的声音读取文本,或更改发音。搜索引擎蜘蛛可能会认为文本比其他元素更重要。

<BR>标记也是如此 - 它不仅仅是另一个字符实体,它实际上代表了文档结构中的一个中断。 <BR&gt;它不仅仅是换行符的替代品,而且是文档的“语义”部分以及它的结构。这类似于<H1>不仅仅是使文本更大更大胆的方式,而且是文档结构化方式的一个组成部分。

答案 6 :(得分:2)

但是,

br元素可以设置样式。你会如何设计HTML实体的样式?因为它们是元素,所以它们更灵活。

答案 7 :(得分:0)

是。 HTML实体更合适,因为break标记不能包含文本,并且行为与换行符非常相似。

但事情并非如此。太晚了。我不能告诉你由于未关闭的中断标记而我必须处理的非XML兼容的HTML文档的数量......