编码和解码
在软件开发中,有很多地方都可能涉及到编码解码
而不同类型的编码和解码在不同场景中意义不同,有的时候我们称字符编码解码、或者是为url编码解码、又或者是html编码解码
本文将对上面提到的三种编码解码简单说明
编码解码简介
所谓编码,即将一种格式的数据转换成另一种格式
所谓解码,即将编码后的数据还原成原始格式
字符编码解码
为什么要对字符进行编码?
因为在计算机中,不能存储字符,只能存储0和1两个数字。因此,无论什么字符,都必须转换为使用0和1表示的数字后才能存储到计算机。
而把字符通过某种规则,转换成数字,就是字符编码。
字符编码的规则只有一种吗?
不是的,字符编码的规则很多,比如:ASCII、unicode、utf-8、gbk、big5等等等等。
同一个字符,用不同的规则进行编码后,得到的数字可能有差异。
每一种字符编码是不是都能涵盖所有的字符?
不是的,比如ASCII编码,只支持所有的英文字母、英文符号和数字。其他的字符它无法对其进行编码;而gbk编码对简体中文支持良好,但对一些其他国家的文字就不行了
对一个字符,如果使用一种编码方式编码,但使用另一种方式解码,会怎么样呢?
会发生乱码的情况。在解码时,应该使用对应编码的解码方式才能还原最终的结果。
比如一个“我”字,使用unicode进行编码保存,但使用big5的方式解码,则会得到乱码。以后在PHP的文件处理章节中会详细说明
url编码解码
为什么需要对url地址进行编码解码?
在http协议中,对url地址部分,仅支持ASCII编码,也就是说,在url地址中只能存在英文字符、英文字母、数字。如果出现其他的字符,http无法识别。
那如果要在url中放入其他字符怎么办呢?就需要按照某种规则,将这些特殊的字符转换成另一种被ASCII编码支持的字符
url地址的编码和解码有哪些规则?
url地址的编码规则,使用的是,由国际标准组织(ISO),在2005年发布的RFC3986“%编码”规范。
绝大部分浏览器都支持这样的规范
RFC3986“%编码”规范具体是什么内容
简单的说,就是把一个字符,使用某种字符编码得到它的十六进制表示格式,然后在每两段十六进制前面使用%
举个例子,比如,对“我”使用url编码,那么具体的流程如下:
- 对“我”这个字符进行utf-8编码,得到一个数字:15108241
- 对其数字使用十六进制表示:E68891
- 在每两段十六进制前面加上百分号:%E6%88%91
- %E6%88%91就是最终的编码结果
再举个例子,比如对url中的保留字&进行编码:
- 对“&”这个字符进行utf-8编码,得到一个数字:38
- 对其数字使用十六进制表示:26
- 在每两段十六进制前面加上百分号:%26
- %26就是最终的编码结果
对所有字符都可以使用url编码吗?
不是的,url编码只是为了解决非ASCII字符和保留字问题,如果字符本身就是一个ASCII字符或保留字,则使用url编码不会发生任何变化
比如,如果你对“a”这个字符使用url编码,得到的结果还是“a”,因为“a”本身就是一个ASCII字符,并且它也不是url地址中的保留字,所有不会对其进行编码
在对url地址中某些数据进行编码时,一定会使用utf-8编码吗?
在大部分情况下是这样,这是由浏览器开发商自行设定的规则,不同的浏览器使用哪种字符编码来处理url,里面有很多的细节,目前不必深究。你可以认为就是使用utf-8编码即可。
在需要编码时,我是要对整个url进行编码吗?
不对!
比如,要访问这样的地址:http://localhost/index.php?d=新闻
在这个地址中,只需要编码新闻
即可,如果你对整个url地址进行编码,则会得到以下的结果:
http%3A%2F%2F
localhost%2F
index.php%3F
d%3D%E6%96%B0%E9%97%BB
上面深色的部分,是对地址中的保留字编码的结果,而这样的地址不是一个有效的url格式,无法访问。
总之,在处理url编码时,仅需要对用户数据部分进行编码,而解码时也是对用户数据进行解码
html编码解码
什么是html编码解码?
就是对html中一些特殊字符使用另一种形式表示,我们通常把编码后的形式,叫做html实体字符
比如:
<
被html编码后:<
>
被html编码后:>
为什么需要html编码呢?
如果你想在页面上显示:<p>
,你不可以直接把<p>
直接写到html源码中,因为你这样做,会被浏览器认为是一个标签,而不是一个普通的<p>
字符
所以,你就需要对<p>
进行html编码,把里面的特殊字符转换成html实体后,得到:<p>
,这样就可以在页面上显示出<p>
了。
在PHP中如何进行html编码呢?
php提供了两个函数分别用于html的编码和解码:
echo '<p>hello</p>'; //不编码输出
echo htmlspecialchars('<p>hello</p>'); //输出html编码后的结果
echo htmlspecialchars_decode('<p>hello</p>');//输出html解码后的结果
最终输出:
<p>hello</p>
<p>hello</p>
<p>hello</p>
这样的结果发送给浏览器后,浏览器显示: