前言
什么是编码呢?计算机只认识0和1,将我们知道的字符翻译成计算机认识的语言,即二进制,这个过程称之为编码。
编码格式
- ASCII编码
使用8位二进制来编码,其中控制字符为不可见字符,而能够打印出来的为可见字符。
- Unicode编码
Unicode又称为万国符,可以表示世界上的所有字符,编号范围从 0x000000 到 0x10FFFF (十六进制),大概有110多万个。每个字符都有唯一的编号,一般是用十六进制表示,并在前面加上\u。比如"国"的Unicode编码是\u56fd
但Unicode只是一个庞大的字符集,并没有规定存储方式,所以会有以下两个问题
1、计算机无法区别Unicode 和 ASCII,比如有两个字节,计算机不知道这是代表一个字符还两个字符。
2、字母用一个字节就能存储,如果统一规定使用3或是4个字节表示一个字符的话,会造成资源的浪费。
对此出现过许多存储方案,主要有UTF-8,UTF-16,UTF-32,其中UTF-8最为广泛使用的,所以重点了解UTF-8
- UTF-8
UTF-8是使用最广的一种 Unicode 的实现方式
特点:它是一种变长的编码方式,可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
UTF-8 的编码规则是:
① 对于单字节的符号,字节的第一位设为 0,后面的7位为这个符号的 Unicode 码
② 对于n字节的符号(n>1),第一个字节的前 n 位都设为 1,第 n+1 位设为 0,后面字节的前两位一律设为 10,剩下的没有提及的二进制位,全部为这个符号的 Unicode 码 。
具体的 Unicode 编号范围与对应的 UTF-8 二进制格式如下图
格式转换如下
"马"对应的unicode编码00009A6C 和utf-8编码E9A9AC,具体转换规则如下图
- URL编码
(1)、URL编码的作用:解决歧义和解决不安全字符
(2)、HTTP协议传参过程中需要某些特殊字符来起分隔作用。比如"?name1=value1&name2=value2",其中 “&” 用来分隔不同参数,而 “=” 则是分隔参数值。
但如果url参数中包含特殊字符呢?比如"name1=aa&bb=cc",“aa&bb=cc"是一个参数值,但服务器会解读为两个键值对,造成歧义。
而url编码就是在特殊字符对应ASCII值得前面加上%,将上面歧义的语句编码为"name1=aa%23bb%3dcc”。其中 “&” 对应 “%23”,"=" 对应 “%3d”。这样服务器会把紧跟在”%”后的字节当成普通字节,不会当成各个参数或键值对的分隔符。
(3)、一般URL地址栏很少看到中文,因为也是被URL编码了。比如”中文”使用UTF-8编码得到的字节是0xE4 0xB8 0xAD 0xE6 0x96 0x87,经过URL编码之后得到%E4%B8%AD%E6%96%87
- HTML编码
HTML编码即HtmlEncode,主要是转换HTML页面中的特殊字符,用来防御XSS攻击
主要对以下特殊字符做转换
举例:用户输入<script>alert('xss')</script>,如果前后端没有做限制的情况下原样输出,浏览器会把它当成js脚本,会弹出一个提示框。使用HtmlEncode编码后,<被转换成<,而>被转换成>,这样浏览器就不会错误的识别成js脚本了,可以有效防御XSS攻击。
- JS编码
常用的编码方式是使用4个16进制数字,如\uxxxx这种写法的unicode转义序列来表示一个字符,其中x代表16进制数字,例如e的编码为\u0065