浏览器编码与解码
访问网站过程中涉及的编解码
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 | <h1>Main Title</h1> //无效代码 |
上例中,第一条不会被正常解析,第二条会被正常解析,由此可将html实体编码的解码是发生在DOM树构建完成后才进行的
,故html实体编码只能出现在数据区域,不能出现在标签开始状态与结束状态,这两种状态都不会被成功解码
。这很重要
JS解码
得到一个html文档后,浏览器顺序构造dom树与cssom树,当遇到一个