查看这个官方 entities.json 文件,一些实体的定义没有结尾分号。
例如:
"Â": { "codepoints": [194], "characters": "\u00C2" },
"Â": { "codepoints": [194], "characters": "\u00C2" },
HTML5 中的记录在哪里?或者那是一个浏览器东西¹?
¹ thing 如扩展中所示,以实现向后兼容性。
HTML 命名字符列表定义于 https://html.spec.whatwg.org/multipage/named-characters.html 是的,其中一些没有尾随
;
例如 ¬
¬
规范中有一些相关部分:
命名角色参考
&符号后面必须跟在命名字符引用
部分中给出的名称之一,使用相同的大小写。该名称必须以 U+003B 分号字符 (;) 结尾。
13.2.5.73 命名字符引用状态(如果您真的想了解解析算法可怕的难以阅读的实现细节)。
非规范的,其中包含一些关于为什么规范在没有分号错误的情况下进行引用的解释(尽管我个人并不认为它非常引人注目): 涉及脆弱语法结构的错误
由于历史原因,有些语法结构相对脆弱。为了帮助减少意外遇到此类问题的用户数量,他们被设为不合格。作为像示例
例如,即使省略结束分号,也会对属性中的某些命名字符引用进行解析。包含一个&号后跟不形成命名字符引用的字母是安全的,但如果将字母更改为确实形成命名字符引用的字符串,它们将被解释为该字符。
在此片段中,属性值为
:
"?bill&ted"
但是,在下面的片段中,属性的值实际上是<a href="?bill&ted">Bill and Ted</a>
,而不是预期的"?art©"
"?art©"
,因为即使没有最后的分号,"©"
的处理方式也与"©"
相同,因此会被解释为"©"
:为了避免此问题,所有命名字符引用都必须以分号结尾,并且使用不带分号的命名字符引用将被标记为错误。因此,上述情况的正确表达方式如下:<a href="?art©">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&copy">Art and Copy</a> <!-- the & has to be escaped, since © is a named character reference -->
Â
<!DOCTYPE html>
<html lang="en">
<title>Test page</title>
<div>Â</div>
</html>
在 Chrome 中打开它,它可以工作并向我们显示带有扬抑符的 A:但是将其粘贴到 Nu Html Checker
(由 WhatWG 认可)中,我们会收到一条错误,指出 “命名字符引用未以分号终止。”:
我用Python编写了一个程序来获取一些数字,我发现:
4.75%
或106 个末尾没有分号的有效实体 所有这些实体:
Æ, &, Á, Â, À, Å, Ã, Ä, ©, Ç, Ð, É, Ê, È, Ë, >, Í, Î, Ì, Ï, <, Ñ, Ó, Ô, Ò, Ø, Õ, Ö, ", ®, Þ, Ú, Û, Ù, Ü, Ý, á, â, ´, æ, à, &, å, ã, ä, ¦, ç, ¸, ¢, ©, ¤, °, ÷, é, ê, è, ð, ë, ½, ¼, ¾, >, í, î, ¡, ì, ¿, ï, «, <, ¯, µ, ·,  , ¬, ñ, ó, ô, ò, ª, º, ø, õ, ö, ¶, ±, £, ", », ®, §, ­, ¹, ², ³, ß, þ, ×, ú, û, ù, ¨, ü, ý, ¥, ÿ
推测什么可能会引发这种情况,没有“;”的实体是有效的根据
这可能是因为旧版本的 Netscape 总是接受其中一些形式,但这只能被视为向后兼容为具有有限字符集的旧浏览器编写的页面(例如“°C”呈现为“°C” "),但不会为 Unicode 的其余部分扩散。