为什么<br>是HTML元素而不是HTML实体?

Wab*_*son 56 html

为什么呢?不是&br;更合适吗?

Jon*_*nna 33

HTML实体引用取决于HTML版本SGML实体或XML实体(HTML继承底层技术中的实体).实体是一种将在别处定义的内容块插入到文档中的方法.

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

当HTML处理器看到时,例如&mdash;它根据DTD中的部分说明用适当的实体替换该实体引用的内容:

<!ENTITY mdash   CDATA "&#8212;" -- em dash, U+2014 ISOpub -->
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • @Donal当我说它们在技术上不同时,这正是我的意思,但由于没有多重定义,这种区别没有影响.至于那些认为双重换行与段落相同的人,有太多不同的方式可以使这种想法错误地适应抱怨这个允许的评论空间. (3认同)

Ode*_*ded 21

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

<br>标记存在的原因是HTML崩溃了空白.需要有指定硬换行的方式-这样的地方有一个换行符.这是<br>标签的功能.

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

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


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

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

字符实体是单字符转义符,因此无法在HTML 4规范中再次表示:

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

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

这就是为什么换行符不能由字符实体引用表示的原因.

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

  • 但是`&br;`是一个实体引用,而不仅仅是一个字符引用.它肯定不仅仅代表一个角色. (8认同)
  • 实际上,在空白是显着的情况下(在`<pre>`元素中),不同的行结尾都被标准化而根本不是问题.这个答案完全是误导. (6认同)
  • 这真的与它无关.不同的行结束编码标准是总红鲱鱼.问题不在于没有办法表示以一个字符结尾的行,而是**HTML不区分空格,制表符和换行符**:它们都是空格,并且换行不会特殊治疗. (5认同)
  • 我不明白为什么这个答案仍在起床.从你最初的错误答案开始,你似乎只是复制了其他答案的一部分以保持浮动.但是,除了不准确之外,您的答案仍然没有回答为什么它不是用于标记HTML换行符的实体引用的问题. (4认同)
  • -1我根本看不出它是如何相关的.需要硬换行指示符的原因是因为HTML中的空格被折叠而新行被忽略.它与使用`\ r \n`进行行结尾的Windows没有任何关系. (3认同)
  • @John Kugelman - 问题不在于"为什么需要它?" 问题类似于"HTML元素和HTML实体之间有什么区别?" Oded已经证明HTML实体必须代表单个字符,而新行有时需要两个字符; 因此,单个HTML实体不会根据规范进行剪切. (2认同)
  • 紧接在开始标记之前或紧接在关闭标记之后的那个空白区域不能解释为什么存在"BR"元素. (2认同)
  • @slacker,当然它区分了一个空间和一个&nbsp; 它还区分空格和'T'或's'或'!'.空间与U + 0020相同,并且是可折叠的空白,&nbsp; 与U + 00A0相同,不是可折叠的空格.他们是完全不同的角色. (2认同)

Joh*_*ica 9

实体是其他字符或文本位的替身.在HTML中,它们用于表示难以键入的字符(例如&mdash;" - ")或需要转义的字符(&amp;对于"&").假设&br;实体代表什么?

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

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

一个<br>元素是"硬换行"的概念添加到文档,因为没有字符可以代表这个概念的简单,直接的方式.

  • &NBSP; 是因为空间被忽略而发明的,但是人们仍然需要在html中强制空间进入他们的文本(不使用pre).所以我认为这不仅仅是一个有效的问题,为什么换行不会发生同样的事情.现在有一个特殊的0u00A0 unicode字符用于&nbsp; ,我认为为换行设置一个类似的换行并不是一个坏主意,所以像&br; 可以实施.出于同样的原因,我们有&nbsp; (6认同)
  • @manixrock,你有详细的&nbsp; 完全倒退.&NBSP; 是一个实体引用,因此采用其他地方定义的内容,并在更高级别处理之前将其插入源中.如果不存在不间断的空格字符,那么这是不可能的.&NBSP; 是有用的,因为许多人没有快速绑定他们的键盘上的非破坏空间,并且因为它在源和空间上无法区分.我们之所以没有&br; 是该实体应该被替换的问题. (3认同)
  • @manixrock ......确实从未在任何标准中定义过&nbsp; 不能折叠成单个空格(这将是一个有效的渲染行为),只是在决定文本的换行位置时不能将其视为分词.那&nbsp; 强制额外空间是有效的,并且所有浏览器都做出选择,但不是必需的.你不能说标准做了什么允许X甚至不承诺X会发生. (2认同)

Gum*_*mbo 6

在HTML中,所有换行符都被视为空格:

换行符定义为回车符(&#x000D;),换行符(&#x000A;)或回车符/换行符对.所有换行符构成空白区域.

并且空白区域仅分隔单词并且白色空间序列被折叠:

对于除了PRE白色空间序列之外的所有HTML元素,单独的"单词"(我们在这里使用术语"单词"表示"非空白字符的序列").[...]

[...]

注意,源文档中的单词之间的一系列空白空间可能导致完全不同的渲染的字间间隔(除了PRE元素的情况).特别是,用户代理应在生成输出字间空间时折叠输入空格序列.[...]

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

需要注意的是,虽然&#x2028;&#x2029;在[ISO10646]中定义明确地分开行和段落,分别为这些不构成HTML换行符[...]

这意味着没有普通字符或普通字符序列来标记HTML中的换行符.这就是为什么有BR元素的原因.

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

<!ENTITY br "<br>">
Run Code Online (Sandbox Code Playgroud)

将此附加实体命名为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>
Run Code Online (Sandbox Code Playgroud)

  • 他们想要完全停止使用```,所以他们必须将它定义为`<pre>&#a; </ pre>` (2认同)