0%

浏览器编码与解码

浏览器编码与解码

访问网站过程中涉及的编解码

URL编码

在url中如果在参数部分出现/等特殊字符,会导致浏览器对资源路径的错误判断,为了解决这个问题,引入了url编码这一概念,它是以%加字符的ascii码对应的二位十六进制数如 ‘=%23 space=%20

HTML编码

在html中有一些字符是需要预留的,如< & 等,如果用户输入这些字符后被直接输出到html中,则可能导致浏览器在创建dom树的时候错误的识别标签的开始,从而导致错误。于是引入了html编码,有两种类型,被称为HTML编码与HTML编号。如<可以被表示为:<,<,<

注意:&开头 ;结尾

JS编码

js编码采用unicode字符集,四个字节表示一个字符

js常见的反斜杠方式编码处理

  • \b退格符,\t制表符,\v垂直制表符等;
  • 三位数字,不足位数用0补充,按8位原字符八进制字符编码;
  • 两位数字,不足位数用0补充,按8位原字符16进制字符编码,前缀 x
  • 四位数字,不足为数用0补充,按16位原字符16进制Unicode数值编码,前缀 u 。

如\145、\x65和\u0065都代表字符e。

浏览器解码顺序

URL解码

url解码过程较为简单,服务器对接收到用户传输过来的URL进行解析,遇到%便自动进行解码。

HTML解码

HTML解析器其实是一个状态机,在对HTML资源从上而下进行解析时遇到一个‘<‘符号就会进入标签开始状态(Tag Open State),然后搜寻标签,img可以被识别为正确的标签,img1则不会识别,最后在读到最近的一个‘>’时,结束标签状态进入数据状态(Data State)。

1
2
<&#104;1>Main Title</h1> //无效代码
<h1>M&#97;inT&#105;tle</h1> //有效代码

上例中,第一条不会被正常解析,第二条会被正常解析,由此可将html实体编码的解码是发生在DOM树构建完成后才进行的故html实体编码只能出现在数据区域,不能出现在标签开始状态与结束状态,这两种状态都不会被成功解码。这很重要

JS解码

得到一个html文档后,浏览器顺序构造dom树与cssom树,当遇到一个