【问题标题】:Which are the HTML, and XML, special characters?哪些是 HTML 和 XML 特殊字符?
【发布时间】:2011-11-07 02:48:14
【问题描述】:

什么是 HTML 和 XML 中的特殊保留字符实体?

我所说的信息:

HTML:

  • & (替换为&
  • < (替换为<
  • > (替换为>
  • " (替换为"
  • ' (替换为'

XML:

  • < (替换为<
  • > (替换为>
  • & (替换为&
  • ' (替换为'
  • " (替换为"

但是我找不到关于这些的文档。

W3C 在Extensible Markup Language (XML) 1.0 (Fifth Edition) 中确实提到了某些预定义的实体引用。但它说这些实体是预定义的(与© 预定义的方式相同);并不是说它们必须被转义:

4.6 Predefined Entities

[定义:实体和字符引用都可以用于 转义左尖括号、& 和其他分隔符。一套 为此指定了一般实体(amp、lt、gt、apos、quot) 目的。也可以使用数字字符引用;他们是 识别时立即展开,必须视为字符 数据,所以数字字符引用“<”和“&”可能 用于在字符数据中出现

HTML中哪些字符必须转义到实体引用中? 必须将哪些字符转义到 XML 中的实体引用中?


更新

来自Extensible Markup Language (XML) 1.0 (Fifth Edition)

2.4 Character Data and Markup

& 字符 (&amp;amp;) 和左尖括号 (&amp;lt;) 不得 以字面形式出现,除非用作标记分隔符, 或在注释、处理指令或 CDATA 部分中。 如果 它们在其他地方需要,它们必须使用任一数字进行转义 字符引用或字符串“&amp;amp;”和“&amp;lt;” 分别。

右尖括号 (&amp;gt;) 可以使用 字符串“&amp;gt;”和必须,为了兼容性,使用以下任一方法进行转义 “&amp;gt;”或出现在字符串“]]&gt;”中的字符引用 在内容中,当该字符串未标记 CDATA 部分的结尾时。

为了允许属性值同时包含单引号和双引号,撇号或单引号字符 (') 可以表示为“&amp;apos;”,而双引号字符 (") 可以表示为“ &amp;quot;"。

我读过前者是这样说的

必须是

  • &amp;lt; (&amp;lt;) 必须是
  • &amp;amp; (&amp;amp;) 必须是

可以,但在显示为]]&gt;必须

  • &amp;gt; (&amp;gt;) 必须是,如果显示为 ]]&gt;

而且'" 根本不需要转义;除非你想在带引号的属性中加上引号。


来自HTML 4.01 Specification, HTML Document Representation

5.3.2 Character entity references

希望在文本中添加“&amp;lt;”字符的作者应使用“&amp;lt;” (ASCII 十进制 60)以避免可能与开头的混淆 标记(开始标记打开分隔符)。

同样,作者应使用“&amp;gt;” (ASCII 十进制 62)在文本中而不是“&amp;gt;”以避免旧的问题 用户代理错误地认为这是一个标签的结束(标签 关闭分隔符)出现在带引号的属性值中时。

作者应使用“&amp;amp;”(ASCII 十进制 38)而不是“&amp;amp;”以避免 与字符引用的开头混淆(实体 引用打开分隔符)。作者还应该使用“&amp;amp;”在 属性值,因为 CDATA 中允许字符引用 属性值。

有些作者使用字符实体引用“&amp;quot;”进行编码 双引号 (") 的实例,因为该字符可能是 用于分隔属性值。

HTML 在规则上更加空泛,但听起来我应该

  • &amp;lt; 应与 &amp;lt;
  • &amp;gt; 应该与 &amp;gt;
  • &amp;amp; 应该与 &amp;amp;
  • " 应该与 &amp;quot;

如果" 可以是实体引用,我也应该将' 替换为&amp;amp;


更新二

来自HTML5 - A vocabulary and associated APIs for HTML and XHTML

8.3 Serializing HTML fragments

转义字符串(出于上述算法的目的)包括 运行以下步骤:

用字符串“&amp;amp;”替换任何出现的“&amp;amp;”字符。

将所有出现的 U+00A0 NO-BREAK SPACE 字符替换为 字符串“&amp;nbsp;”。

如果算法是在属性模式下调用的,则替换任何 字符串“&amp;quot;”出现的“"”字符。

如果没有在属性模式下调用算法,则替换任何 字符串“&amp;lt;”出现的“&amp;lt;”字符,以及任何 字符串“&amp;gt;”出现“&amp;gt;”字符。

我读为 HTML

  • &amp;amp; &amp;amp; 总是
  • &amp;nbsp; 总是
  • " &amp;quot; 如果它在属性内
  • &amp;lt; by &amp;lt; 如果它不是在属性中(即属性可以包含&amp;lt;
  • &amp;gt; by &amp;gt; 如果它不是在属性中(即属性可以包含&amp;gt;

【问题讨论】:

  • 你真的应该把你的问题和你的答案分开。
  • 我没有答案。我的研究可能正确也可能不正确。知道答案的人可以发布它,如果它实际上是正确的,知道的人可以投票。
  • 如果以上不是答案,那么您需要更清楚自己在寻找什么!
  • 我找到了五个不同的来源,它们说了三种不同的东西。知道的人需要决定哪个来源是正确的,哪个是错误的。
  • 奇怪的是,HTML 4 和 5 关于何时应该转义 &amp;gt;(是否在属性中)的说法相反。

标签: xml http special-characters htmlspecialchars entityreference


【解决方案1】:

首先,您将HTML 4.01 specificationHTML 5 one 进行比较。 HTML5 与 XML 的联系比 HTML 4.01 更紧密(这就是我们有 XHTML 的原因),所以这个答案将坚持 HTML 5 和 XML。

您引用的参考文献在以下几点上都是一致的:

  • &amp;lt; 在不指示处理指令时应始终用&amp;lt; 表示
  • &amp;gt; 在不指示处理指令时应始终用&amp;gt; 表示
  • &amp;amp; 应始终以 &amp;amp; 表示
  • 除了&lt;![CDATA[ ]]&gt;内(仅适用于XML)

我 100% 同意这一点。您永远不希望解析器将文字误认为是指令,因此始终对任何非空格(见下文)字符进行编码是一个不错的主意。优秀的解析器知道 &lt;![CDATA[ ]]&gt; 中包含的任何内容都不是指令,因此那里不需要编码。

实际上,除非

  • 它出现在属性(XML 或 HTML)的值中
  • 它出现在 XML 标记的文本中。 (&lt;tag&gt;&amp;quot;Yoinks!&amp;quot;, he said.&lt;/tag&gt;)

这两个规范也同意这一点。

所以,唯一的争论点是(空格)。在任一规范中唯一提到它是在尝试序列化时。如果不是,您应该始终使用文字 (空格)。除非您正在编写自己的解析器,否则我认为不需要进行任何类型的序列化,所以这不是重点。

【讨论】:

  • 没有理由逃避&amp;gt;,除非在XML 线性化中的数据中]]&gt; 非常特殊且极为罕见。如果需要,它可以为了对称而被转义(通过转义&amp;lt;)。这就是参考文献实际所说的。并且没有理由转义'",除非在属性值内使用相同的字符作为属性值分隔符。
  • 如果您只对出现在属性值或元素文本内容中的引号进行编码,那么在什么其他上下文中,该文本会出现您不转义它们?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-04
  • 1970-01-01
  • 1970-01-01
  • 2012-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多