编码和解码

在软件开发中,有很多地方都可能涉及到编码解码

而不同类型的编码和解码在不同场景中意义不同,有的时候我们称字符编码解码、或者是为url编码解码、又或者是html编码解码

本文将对上面提到的三种编码解码简单说明



编码解码简介

所谓编码,即将一种格式的数据转换成另一种格式

Alt text

所谓解码,即将编码后的数据还原成原始格式

Alt text

字符编码解码

为什么要对字符进行编码?

因为在计算机中,不能存储字符,只能存储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编码,那么具体的流程如下:

  1. 对“我”这个字符进行utf-8编码,得到一个数字:15108241
  2. 对其数字使用十六进制表示:E68891
  3. 在每两段十六进制前面加上百分号:%E6%88%91
  4. %E6%88%91就是最终的编码结果

再举个例子,比如对url中的保留字&进行编码:

  1. 对“&”这个字符进行utf-8编码,得到一个数字:38
  2. 对其数字使用十六进制表示:26
  3. 在每两段十六进制前面加上百分号:%26
  4. %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%2Flocalhost%2Findex.php%3Fd%3D%E6%96%B0%E9%97%BB

上面深色的部分,是对地址中的保留字编码的结果,而这样的地址不是一个有效的url格式,无法访问。

总之,在处理url编码时,仅需要对用户数据部分进行编码,而解码时也是对用户数据进行解码

html编码解码

什么是html编码解码?

就是对html中一些特殊字符使用另一种形式表示,我们通常把编码后的形式,叫做html实体字符

比如:

  • <被html编码后:&lt;
  • >被html编码后:&gt;

为什么需要html编码呢?

如果你想在页面上显示:<p>,你不可以直接把<p>直接写到html源码中,因为你这样做,会被浏览器认为是一个标签,而不是一个普通的<p>字符

所以,你就需要对<p>进行html编码,把里面的特殊字符转换成html实体后,得到:&lt;p&gt;,这样就可以在页面上显示出<p>了。

在PHP中如何进行html编码呢?

php提供了两个函数分别用于html的编码和解码:

echo '<p>hello</p>'; //不编码输出
echo htmlspecialchars('<p>hello</p>'); //输出html编码后的结果
echo htmlspecialchars_decode('&lt;p&gt;hello&lt;/p&gt;');//输出html解码后的结果

最终输出:

<p>hello</p>
&lt;p&gt;hello&lt;/p&gt;
<p>hello</p>

这样的结果发送给浏览器后,浏览器显示:

Alt text

posted @ 2017-08-15 17:55  绝版扫地僧  阅读(579)  评论(0编辑  收藏  举报