是否有一些不带分号的有效 HTML 实体?

问题描述 投票:0回答:4

查看这个官方 entities.json 文件,一些实体的定义没有结尾分号。

例如:

"&Acirc": { "codepoints": [194], "characters": "\u00C2" },
"Â": { "codepoints": [194], "characters": "\u00C2" },

HTML5 中的记录在哪里?或者那是一个浏览器东西¹

¹ thing扩展中所示,以实现向后兼容性。

html html-entities
4个回答
3
投票

HTML 命名字符列表定义于 https://html.spec.whatwg.org/multipage/named-characters.html 是的,其中一些没有尾随

;
例如
&not

&not


2
投票
根据 HTML 规范,不带分号的命名 HTML 实体是无效的,但无论如何浏览器都需要支持其中的一些实体。 (这种规范模式 - 作为 HTML 作者,你做的事情在官方上是非法的,但仍然具有浏览器必须实现的单一明确指定的行为 - 在 HTML 规范中被大量使用。)

规范中有一些相关部分:

    §13.1.4 角色参考
  • 相关引用:

    命名角色参考

    &符号后面必须跟在

    命名字符引用

    部分中给出的名称之一,使用相同的大小写。该名称必须以 U+003B 分号字符 (;) 结尾。

  • §13.2 解析 HTML 文档
  • ,尤其是

    13.2.5.73 命名字符引用状态(如果您真的想了解解析算法可怕的难以阅读的实现细节)。

    非规范的
  • §1.11.2语法错误

    ,其中包含一些关于为什么规范在没有分号错误的情况下进行引用的解释(尽管我个人并不认为它非常引人注目): 涉及脆弱语法结构的错误

    由于历史原因,有些语法结构相对脆弱。为了帮助减少意外遇到此类问题的用户数量,他们被设为不合格。

    示例

    例如,即使省略结束分号,也会对属性中的某些命名字符引用进行解析。包含一个&号后跟不形成命名字符引用的字母是安全的,但如果将字母更改为确实形成命名字符引用的字符串,它们将被解释为该字符。
    在此片段中,属性值为

    "?bill&ted"

    :

    <a href="?bill&ted">Bill and Ted</a>
    

    但是,在下面的片段中,属性的值实际上是
    "?art©"
    ,而不是预期的

    "?art&copy"

    ,因为即使没有最后的分号,
    "&copy"
     的处理方式也与 
    "&copy;"
     相同,因此会被解释为 
    "©"
     :
    <a href="?art&copy">Art and Copy</a>
    

    为了避免此问题,所有命名字符引用都必须以分号结尾,并且使用不带分号的命名字符引用将被标记为错误。
    因此,上述情况的正确表达方式如下:

    <a href="?bill&ted">Bill and Ted</a> <!-- &ted is ok, since it's not a named character reference --> <a href="?art&amp;copy">Art and Copy</a> <!-- the & has to be escaped, since &copy is a named character reference -->

    
    
    作为像
  • &Acirc
这样的实体无效但仍然有效的最后一点证实,我们可以使用此测试文档:

<!DOCTYPE html>
<html lang="en">
  <title>Test page</title>
  <div>&Acirc</div>
</html>

在 Chrome 中打开它,它可以工作并向我们显示带有扬抑符的 A:

screenshot但是将其粘贴到 Nu Html Checker

由 WhatWG 认可)中,我们会收到一条错误,指出 “命名字符引用未以分号终止。”:

screenshot即它有效,但无效。

我用Python编写了一个程序来获取一些数字,我发现:

1
投票
在总共 2231 个实体中,有

4.75%

106 个末尾没有分号的有效实体 所有这些实体:

&AElig, &AMP, &Aacute, &Acirc, &Agrave, &Aring, &Atilde, &Auml, &COPY, &Ccedil, &ETH, &Eacute, &Ecirc, &Egrave, &Euml, &GT, &Iacute, &Icirc, &Igrave, &Iuml, &LT, &Ntilde, &Oacute, &Ocirc, &Ograve, &Oslash, &Otilde, &Ouml, &QUOT, &REG, &THORN, &Uacute, &Ucirc, &Ugrave, &Uuml, &Yacute, &aacute, &acirc, &acute, &aelig, &agrave, &amp, &aring, &atilde, &auml, &brvbar, &ccedil, &cedil, &cent, &copy, &curren, &deg, &divide, &eacute, &ecirc, &egrave, &eth, &euml, &frac12, &frac14, &frac34, &gt, &iacute, &icirc, &iexcl, &igrave, &iquest, &iuml, &laquo, &lt, &macr, &micro, &middot, &nbsp, &not, &ntilde, &oacute, &ocirc, &ograve, &ordf, &ordm, &oslash, &otilde, &ouml, &para, &plusmn, &pound, &quot, &raquo, &reg, &sect, &shy, &sup1, &sup2, &sup3, &szlig, &thorn, &times, &uacute, &ucirc, &ugrave, &uml, &uuml, &yacute, &yen, &yuml

推测什么可能会引发这种情况,没有“;”的实体是有效的根据

© www.soinside.com 2019 - 2024. All rights reserved.