从状态机的角度看 HTML 实体编码的解析:你知道 HTML 实体编码处于哪些位置时可以被正常解析吗?

news2024/11/18 1:37:02

文章目录

  • 参考
  • 描述
  • HTML 实体编码
      • HTML 实体编码
      • 为什么需要 HTML 字符编码
          • 支持特殊字符和符号
          • 避免语法冲突
      • HTML 实体编号与实体字符
      • 常用字符所对应的 HTML 实体编码
  • HTML 实体编码与 HTML 解析器
      • 状态机
      • 有限状态机
      • HTML 解析器
      • HTML 与有限状态机
      • HTML 解析器与 HTML 实体编码
          • 属性值状态
          • 文本状态
          • RCDATA 状态
            • RCDATA 元素
            • RCDATA 状态

参考

项目描述
搜索引擎Google 、Bing
维基百科首页
百度百科首页
MDN文档
HTML Standardparsing.html
W3schoolHTML 编码(字符集)

描述

项目描述
浏览器Edge 111.0.1661.62 (正式版本) (64 位)

HTML 实体编码

HTML 实体编码

HTML 实体编码

HTML 实体编码是一种将 Unicode 字符转换为 HTML 实体的机制,用于在 HTML 中表示各种字符,包括 ASCII 字符集(HTML 本身只支持 ASCII 字符集)之外的字符。

实体

在 HTML 实体编码中,实体(Entity) 指的是一种特殊的表示形式,用于表示特定字符或符号。这些实体是 预定义 的,通过使用实体名称或实体编号来表示字符。

实体名称

实体名称(Entity Name)是一个以 & 开头,以 ; 结尾的特殊字符串,用于表示相应的字符。例如,&amp; 表示字符 &&lt; 表示字符 <&gt; 表示字符 >

实体编号

实体编号(Entity Numeric)是以 &# 开头,以 ; 结尾的特殊字符串,后跟字符的十进制或十六进制编码(以 &#x&#X 开头)。例如,&#38; 表示字符 &&#x4e2d; 表示中文字符 &#X3C; 表示字符 <

为什么需要 HTML 字符编码

支持特殊字符和符号

HTML 本身只支持有限的字符集( ASCII 字符集 )。然而,网页中常常需要展示特殊字符、符号或表情符号等,这些字符可能不在 ASCII 字符集范围内。通过实体编码,HTML 可以表示 任意 Unicode 字符,包括特殊字符、表情符号、各种语言的文字等。

使用 HTML 实体编号表示的一些常用表情符号

特殊符号HTML 实体编码
🙂&#x1F642;
😉&#x1F609;
😎&#x1F60E;
😍&#x1F60D;
😂&#x1F602;
😊&#x1F60A;
😘&#x1F618;
👍&#x1F44D;
❤️&#x2764;
🌹&#x1F339;

这些是一些示例,你可以使用相应的 HTML 实体编码来在网页中显示这些表情符号。请注意,不同的操作系统、浏览器和字体可能会对表情符号的显示产生差异。

避免语法冲突

HTML 中使用尖括号(<>)来标记标签,使用 & 符号来表示实体编码的开始。如果直接在 HTML 中使用这些字符,会与标签和实体引起语法冲突,导致解析错误。通过字符编码,可以将这些特殊字符转换为实体形式,避免语法冲突。

举个栗子

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>Hello World</h1>
    
    <!-- 使用 HTML 字符实体来表示 <h1>Hello World</h1> -->
    <h3> &lt;h1&gt;Hello World&lt;/h1&gt; </h3>
</body>
</html>

执行效果

在上述代码中,我们使用 HTML 字符实体来表示 <h1>Hello World</h1> 。正如你所观察到的,使用 HTML 字符实体表示 <h1> 标签并不会使其具有 <h1> 的特征(具有相比 <h3> 更大的字符大小等),它仅仅作为 <h3> 标签内部的 纯文本

HTML 实体编号与实体字符

HTML 实体编号(Entity Numeric)和 HTML 实体字符(Entity Name)都是用于表示字符的方法,但它们有一些区别。

HTML 实体编号使用字符的十进制或十六进制编码来表示字符。通过使用实体编号,可以表示任意 Unicode 字符,包括 ASCII 字符和其他特殊字符。

HTML 实体字符使用 预定义的名称 来表示字符。实体字符通常更易读和易记,因为它们使用了 有意义的名称。但是,实体字符只能表示预定义的字符,无法表示除此之外的字符

在实践中,大多数常见字符和特殊符号都可以使用实体字符进行表示,而只有在需要表示非常罕见或特殊的字符时,才需要使用实体编号。实体字符更常用和推荐,因为它们更易读和理解。

常用字符所对应的 HTML 实体编码

字符HTML 字符编号HTML 字符实体
<&#60;&lt;
>&#62;&gt;
&&#38;&amp;
"&#34;&quot;
&#39;&apos;
/&#47;&#47;
(&#40;&#40;
)&#41;&#41;
;&#59;&#59;
:&#58;&#58;
`&#96;&#96;
{&#123;&#123;
}&#125;&#125;
[&#91;&#91;
]&#93;&#93;
%&#37;&#37;

HTML 实体编码与 HTML 解析器

状态机

状态机(State Machine)是一种用来描述对象或系统的行为的抽象概念。它是由一组状态、一组转移条件和一组动作组成的。在任何时候,状态机只能处于其中一种状态。当满足某些转移条件时,状态机会从当前状态转移到下一个状态,并执行相应的动作。

有限状态机

当一个系统的状态数量是有限的时候,我们就可以使用有限状态机(FSM)来描述它的行为。例如,考虑一个简单的自动售货机,它可以接受硬币、选择饮料、进行交易等。自动售货机可以表示为一个有限状态机,它有以下状态:

  • 等待选择饮料
  • 已选择饮料
  • 等待投币
  • 已投币
  • 正在进行交易
  • 交易完成

这些状态之间的转移可以由用户或自身的行为触发,例如:

  • 选择饮料:从 等待选择饮料 状态转移至 已选择饮料 状态。
  • 投入硬币:从 等待投币 状态转移到 已投币 状态。
  • 自动售货机吐出饮料:从 正在进行交易 状态转移至 交易完成 状态。

HTML 解析器

HTML 解析器是一种将 HTML 文本解析为 DOM(Document Object Model) 树的程序。DOM 树是一种以 分层 的方式表示 HTML 文档的树形结构,其中每个 HTML 元素对应一个节点,而元素中元素则作为该节点下的子节点。

HTML 解析器通常分为两个部分:词法分析器和语法分析器词法分析器将 HTML 文本分解成一个个词法单元(token),例如标签、属性、文本等。语法分析器将这些词法单元组合成一棵 DOM 树,并验证 HTML 文档的语法正确性。

HTML 解析器在 Web 开发中具有重要作用,因为它是浏览器渲染 HTML 页面的关键组件之一。当用户在浏览器中请求一个 HTML 页面时,浏览器会先将该页面的 HTML 文本传递给 HTML 解析器进行解析,生成对应的 DOM 树。随后,浏览器会使用 DOM 树来渲染页面,并执行其中包含的 JavaScript 代码。

HTML 除了应用于浏览器中,还广泛应用于 Web 爬虫、数据挖掘和搜索引擎等领域,用于解析 HTML 文本,以从中提取所需要的信息。

HTML 与有限状态机

HTML 解析器通常使用有限状态机(FSM)来解析 HTML 文档,因为 HTML 文档本身是由有限的、预定义的标签和属性组成的。

具体来说,HTML 解析器可以被视为一种 流式 有限状态机,即解析器将文本数据作为输入流,然后逐个处理输入的字符,根据当前的状态进行相应的转移。解析器通过检查当前字符和上下文来确定下一个状态,并将所需的节点添加到 DOM 树中。

例如,当解析器遇到一个开始标签时,它将进入一个 开始标签 状态,然后逐个解析标签的名称和属性,并将这些信息存储为 DOM 节点的属性。当解析器遇到标签的结束标记时,它将退出 开始标签 状态,并将新的节点添加到 DOM 树中。

HTML 解析器与 HTML 实体编码

HTML 实体编码的解释是与当前 HTML 解析器的状态相关的。在某些状态下,HTML 解析器可以正确地解析实体编码,而在其他状态下,它可能无法正确地解析实体编码。

例如,在 HTML 解析器解析文本内容时,它可以解析实体编码,因为文本内容中可以包含实体编码。但是,在解析脚本标记或样式标记中的文本内容时,解析器不能正确地解析实体编码,因为脚本和样式标记中的文本内容应该是原始文本,而不应该包含实体编码。

因此,HTML 解析器仅能够在部分状态下解析 HTML 实体编码,这是为了避免在不应该使用实体编码的上下文中使用它们,从而导致解析错误或安全漏洞。HTML 规范对实体编码的使用有详细的规定,开发人员应该遵守这些规定来确保 HTML 代码的正确解析和安全性。

HTML 解析器能够在属性值状态、文本状态及 RCDATA 状态(包括但不限于)下解析 HTML 实体编码。

属性值状态

属性值状态

在 HTML 解析器中,属性值状态(attribute value state)是在属性状态(start tag state)下触发的一种状态。在属性值状态中,HTML 解析器会解析开始标签中的属性值,直到遇到引号(单引号或双引号)或者空格等分隔符号。

引号状态与无引号状态

属性值可以有两种写法,分别是带引号的写法和不带引号的写法。在带引号的写法中,属性值必须被一对引号包含,可以是单引号或者双引号。在不带引号的写法中,属性值可以直接跟在等号后面,但是不能包含空格和其他分隔符号。

在属性值状态中,HTML 解析器会忽略开头的空格,直到解析到第一个非空格字符。 如果该字符是引号,则属性值状态切换到对应的引号状态(quoted string state),否则表示属性值是不带引号的写法,直接进入无引号属性值状态(unquoted value state)。

在引号状态或无引号属性值状态中,HTML 解析器会解析属性值中的字符,直到遇到对应的引号或空格等分隔符号为止。 如果属性值中存在字符引用或者数字字符引用,则 HTML 解析器会将其解析为对应的字符。 如果解析到的属性值包含非法字符,则会产生语法错误。

文本状态

在HTML解析器中,文本状态是指解析器正在解析的内容为文本节点,即一段纯文本字符串。当解析器遇到文本内容时,它将进入文本状态,直到遇到一个标签开始符号 <,或者遇到字符引用符号 & 时,解析器将离开文本状态,并开始解析相应的标签或字符引用。

RCDATA 状态
RCDATA 元素

RCDATA 的全称是 Raw Character Data,意为 原始字符数据。RCDATA 元素是 HTML 中的一类元素,其与普通元素的不同之处在于,它们允许字符数据而不会被解析成 HTML 标记,因此 在 RCDATA 元素内可以包含除外围 RCDATA 元素的结束标记外的其他类型的 HTML 元素。

举个栗子

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

    <!-- 
        HTML 解析器会将 textarea 元素中的内容
        均视为纯文本数据。 
	-->
    <textarea cols="100" rows="13">
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!-- 在 RCDATA 状态下的 HTML 字符实体可以被正常解析 -->
    <title> &lt;两侧均是由字符实体转换而来的尖括号&gt; </title>
</head>
<body>

</body>
</html>
    </textarea>

</body>

</html>

执行效果

HTML 规范与 RCDATA 元素

元素功能
<textarea>用于输入多行文本的文本框,可以包含文本和标记。
<title>用于指定文档的标题。
<pre>pre 元素用于指定预格式化文本,保留文本中的空格、换行和其他特殊字符,并将其原样显示在页面上。
RCDATA 状态

RCDATA 元素需要有 RCDATA 状态来解析其中的内容。在 RCDATA 状态下,HTML 解析器会将标记之间的内容解析为纯文本,这意味着 HTML 解析器在遇到 RCDATA 元素中的内容时,将进入 与文本状态类似(在文本状态时,HTML 解析器无法将标签解析为文本但能够解析字符实体)的状态

RCDATA 元素的存在可以方便地在 HTML 中插入纯文本内容,同时避免了因包含 HTML 标记而导致的解析错误。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/496552.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python-11-多线程模块threading

python使用多线程实例讲解 1 进程和线程 1.1 进程和线程的概念 进程(process)和线程(thread)是操作系统的基本概念。 进程是资源分配的最小单位&#xff0c;线程是CPU调度的最小单位。 线程是程序中一个单一的顺序控制流程&#xff0c;进程内一个相对独立的、可调度的执行单…

如何充分利用实时聊天系统?

随着商业和电子商务领域经历快速的数字革命&#xff0c;必须迅速适应的一个因素是我们与客户的互动方式。几年前&#xff0c;电子邮件和电话还是主要的客户联系方式。如今&#xff0c;客户期望更好的服务和更即时的沟通。实时聊天支持系统可以解决此问题&#xff0c;如SaleSmar…

【消息中间件】如何解决RocketMQ消息堆积的问题

文章目录 一、背景二、MQ消息堆积三、消息堆积常见于以下几种情况&#xff1a;四、解决上述问题需要做到五、如何解决消息堆积和延迟问题 一、背景 消息处理流程中&#xff0c;如果客户端的消费速度跟不上服务端的发送速度&#xff0c;未处理的消息会越来越多&#xff0c;这部…

day25_新特性

今日内容 零、 复习昨日 一、JDK8新特性介绍 二、接口新特性 三、Lambda表达式 四、函数式接口 五、Stream流 六、新日期API 零、 复习昨日 晨考 一、JDK8新特性 接口中默认方法静态方法 − 默认方法就是一个在接口里面有了一个实现的方法。静态方法就是接口中有个已经使用的静…

Windows下安装QT

一、Windows下安装QT 1、QT官网 QT官网&#xff1a;https://download.qt.io/&#xff0c;打开官网地址&#xff0c;如下&#xff1a; 目录结构介绍 目录说明snapshots预览版&#xff0c;最新的开发测试中的 Qt 库和开发工具onlineQt 在线安装源official_releases正式发布版&am…

2023,滴滴“摸着自动驾驶过河”

在“滴滴网约车”的出行领域&#xff0c;出行网络和数据量级是滴滴自动驾驶的优势。但就自动驾驶技术本身来看&#xff0c;滴滴仍然需要展示更多的肌肉。 作者|斗斗 出品|产业家 滴滴自动驾驶有了新动作。 一款“人性化”的概念车、两个加速实现量产L4级车辆的自研硬件、一…

【攻略】北京国际鲜花港

文章目录 一、概述二、经典景观1.万花馆2.花艺中心3.花神广场4.瑞云坪5.百花田6.奇石园7.梅园8.唐草园9.幻花湖10.大地花海11.白滩12.樱花大道13.海棠园 三、网友点评四、注意事项五、北京其他景点推荐 北京国际鲜花港_360百科北京顺义区十大著名景点—2、北京顺义国际鲜花港 -…

C嘎嘎~~ [类 下篇]

类 下篇 1.类的6个默认成员函数2.构造函数2.1 构造函数出现的原因2.2 特性2.3 深刻解读---构造函数可以重载2.4 深刻解读---默认构造函数补充: 3.析构函数3.1概念3.2 特性3.3深刻解读例子 总结 4.拷贝构造函数4.1 概念4.2 特性4.3深刻解读---拷贝构造是构造的一种重载4.4深刻理…

【Linux网络】传输层中UDP和TCP协议

文章目录 1、再谈端口号2、UDP协议3、TCP协议3.1 TCP协议段格式3.2 TCP的三次握手和四次挥手&#xff08;连接管理机制&#xff09;3.3 TCP的滑动窗口3.4 TCP的流量控制3.5 拥塞控制3.6 延迟应答和捎带应答3.7 面向字节流和粘包问题3.8 TCP总结 1、再谈端口号 端口号port标识一…

动态规划算法——40道leetcode实例入门到熟练

目录 t0.解题五部曲1.基础入门题目1.509. 斐波那契数2.70. 爬楼梯3.746. 使用最小花费爬楼梯4.62. 不同路径5.63. 不同路径 II6.343. 整数拆分7.96. 不同的二叉搜索树 2.背包问题1.01背包&#xff08;二维数组实现&#xff09;2.01背包&#xff08;滚动数组实现&#xff09;1.4…

OpenPCDet系列 | 4.数据集数据加载流程

文章目录 数据加载流程0. create_kitti_infos1. __getitem__函数2. prepare_data函数3. collate_batch函数数据加载流程 这里记录一下具体用到的那些数据形式,整个kitti数据集的处理框架图如下所示: 在数据集处理到获取一个batch数据的整个流程的入口如下: # 开始迭代每…

01-微服务部署2023系列-centos安装nginx和jdk教程

centos安装nginx和jdk教程 一、centos安装nginx 0、前提:安装依赖 yum -y install gcc gcc-c++ make libtool zlib zlib-devel openssl openssl-devel pcre pcre-devel 1、压缩包 下载nginx 选择Stable version: http://nginx.org/en/download.html 上传压缩包到…

yolov3核心网络模型

1. 改进概述 yolov3主要围绕核心网络Darknet优化进行。 yolov3的速度和map值比之前的算法优秀。 改进包含&#xff1a;网络结构、特征融合、先验框&#xff1a; V1 2, V25,V39、Softmax等。 softmax 2. 多scale方法改进与特征融合 3. 经典变换方法 预测中目标时&#xff0c…

Nacos配置管理、Fegin远程调用、Gateway服务网关

1.Nacos配置管理 Nacos除了可以做注册中心&#xff0c;同样可以做配置管理来使用。 1.1.统一配置管理 当微服务部署的实例越来越多&#xff0c;达到数十、数百时&#xff0c;逐个修改微服务配置就会让人抓狂&#xff0c;而且很容易出错。我们需要一种统一配置管理方案&#xf…

Spring-IOC

IOC概念和原理 什么是IOC 控制反转&#xff0c;为了将系统的耦合度降低&#xff0c;把对象的创建和对象直接的调用过程权限交给Spring进行管理。 IOC底层原理 XML解析 ​ 通过Java代码解析XML配置文件或者注解得到对应的类的全路径&#xff0c;获取对应的Class类 Class clazz …

Django框架之模型查询介绍及示例

本篇文章所使用模型查询都在《Django框架之模型自定义管理器》基础上讲解查询和使用示例&#xff0c;通过看前篇可以有助于理解内容。 概述 查询集&#xff1a;从数据库获取的对象集合 查询集可以有多个过滤器 过滤器就是一个函数&#xff0c;根据所给的参数限制查询集结果 …

【Vue学习笔记5】Vue3中的响应式:ref和reactive、watchEffect和watch

所谓响应式就是界面和数据同步&#xff0c;能实现实时更新。 Vue 中用过三种响应式解决方案&#xff0c;分别是 defineProperty、Proxy 和 value setter。Vue 2 使用的方案是 defineProperty API。Vue3中使用的方案是Proxy和value setter。 1. ref和reactive vue3中实现响应…

基于docker部署ELK实战- ELK文章1

选择版本为elasticsearch:7.17.9&#xff0c;kibana:7.17.9&#xff0c;logstash:7.17.9 版本一定要一致 docker hub地址&#xff1a;https://hub.docker.com elk相关文档&#xff1a;https://www.elastic.co/guide/en/kibana/7.17 一、部署单点es 1.创建网络 因为我们还需要…

iframe嵌套grafana (前端视角)

1、grafana 启动方式 ①.grafana目录鉴赏。咱们就是直接拿到配置好的grafana。咱们暂时不涉及配置数据啥。 ①.双击grafana-server.exe &#xff0c;会出现黑色命令框。 ②.在浏览器中访问 http://localhost:3000 此时就可以看到配置好的grafana 2.前端嵌入 ①.html <…

消息队列中间件 - Docker安装RabbitMQ、AMQP协议、和主要角色

概述 不管是微服务还是分布式的系统架构中&#xff0c;消息队列中间件都是不可缺少的一个重要环节&#xff0c;主流的消息队列中间件有RabbitMQ、RocketMQ等等&#xff0c;从这篇开始详细介绍以RabbitMQ为代表的消息队列中间件。 AMQP协议 AMQP协议是一个提供统一消息服务的应…