在线转换网址

http://tool.chinaz.com/tools/urlencode.aspx

为什么要转换why

  1. 当字符串数据以url的形式传递给web服务器时,字符串中是不允许出现空格和特殊字符串
  2. url对字符有限制,比如把一个邮箱放入url,就需要使用urlencode函数**。**
  3. url转义其实也只是为了符合url的规范而已。因为在标准的url规范中中文和很多的字符是不允许出现在url中的**。**
  4. 如果URL中含有非ASCII字符的话, 浏览器会对URL进行URL_ENCODE, 然后发送给服务器. URL_ENCODE的过程就是把URL作为字符按照某种编码方式(GBK, UTF-8等)编码成二进制的字节码,然后每个字节用一个包含3个字符的字符串 “%xy” 表示,其中xy为该字节的两位十六进制表示形式

    1. urlencode的说明 [https://www.php.net/manual/zh/function.urlencode.php](https://www.php.net/manual/zh/function.urlencode.php) :<br />![image.jpeg](https://cdn.nlark.com/yuque/0/2021/jpeg/1614523/1613494839391-cb7363b0-e13e-4d91-8c7a-0e72d5905f20.jpeg#align=left&display=inline&height=610&margin=%5Bobject%20Object%5D&name=image.jpeg&originHeight=716&originWidth=1092&size=304091&status=done&style=none&width=930)<br />空格则编码位加号(+)。此编码与www表单post数据的编码方式是一样的,同时与application/x-www-form-urlencoded的媒体类型编码方式一样。由于历史原因,此编码在将空格编码为加号(+)方面与RFC3986编码不同。

    哪些字符是需要转化的呢?

    1.、ASCII的控制字符
    这些字符都是不可打印的,自然需要进行转化。
    2.、一些非ASCII字符
    这些字符自然是非法的字符范围。转化也是理所当然的了。
    3.、一些保留字符
    很明显最常见的就是“&”了,如果这个出现在url中,那你认为是url中的一个字符呢,还是特殊的参数分割符呢?
    4.、一些不安全的字符
    例如:空格。为了防止引起歧义,需要被转化为“+”。

    明白了这些,也就知道了为什么需要转化了,而转化的规则也是很简单的。
    按照每个字符对应的字符编码,不是符合我们范围的,统统的转化为 % 的形式,自然也是16进制的形式

    和字符编码有关

    通过urlencode的转化规则和目的,我们也很容易的看出,urlencode是基于字符编码的。同样的一个汉字,不同的编码类型,肯定对应不同的urlencode的串。gbk编码有gbk的encode结果**。**

apache等服务器,接收到字符串后,可以进行decode,但是还是无法解决编码的问题。编码的问题,还是需要靠约定或者字符编码的判断解决**。**

因此,urlencode只是为了url中一些非ASCII字符,可以正确无误的被传输,至于使用哪种编码,就不是urlencode所关心和解决的问题了。

如下同一个 “你” 字不同编码的 UrlEncode 不一样:
image.jpeg

编码原理编辑

将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY格式。

比如:
空格 ASCII码是32,对应16进制是20,那么urlencode编码结果是:%20,但在新标准中空格对应的是+,见RFC-1738
比如:
中 ASCII码是-10544,对应的16进制是D6D0,那么urlencode编码结果是:%D6%D0

统一资源标识符(URI)所允许的字符分作保留与未保留,保留字符是那些具有特殊含义的字符。例如,斜线字符用于URL (或者更一般的, URI)不同部分的分界符,未保留字符没有这些特殊含义。

百分号编码(Percent-encoding)把保留字符表示为特殊字符序列。上述情形随URI与URI的不同版本规格会有轻微的变化。

部分转换规则如下:

空格 ! # $ % + @ : = ?
%20 %21 %23 %24 %25 %2B %40 %3A %3D %3F

附:ISSP实现配置中心存储变种

实际存储时,估计是为了方便C程序处理还是什么的,比如 % 变为了 \ 等,EPS那个框架还是做了些处理的,因为是以 KEY VALUE的形式存储,很多字符感觉还是单独做了处理,直接不转换或变换什么的,比如:
tenant_add_time:2019\2D07\2D10\2016\3A21\3A58 //标准测试 2019-06-16 01:23:55 -> 2019-06-16+01%3a23%3a55 EPS把 - 也转了
tenant_wan_IP:100.64.128.20/20 //标准测试 100.64.128.20%2f20
tenant_account:wcy2@wcy2 //标准测试 wcy2%40wcy2