基础概念——URL编码

URL只能使用英文字母,阿拉伯数字和一些特殊字符;或者说URL 只能使用 ASCII 字符集来通过因特网进行发送。

如果URL中有汉字,就必须编码后使用。

但是麻烦的是 标准的国际组织并没有规定具体的编码方法,而是交给应用程序(浏览器)自己决定。这导致"URL编码"成为了一个混乱的领域。

对于非ASCII字符,RFC文档建议使用utf-8对其进行编码得到相应的字节,然后对每个字节执行百分号编码。

如"中文"使用UTF-8字符集得到的字节为0xE4 0xB8 0xAD 0xE6 0x96 0x87,经过Url编码之后得到"%E4%B8%AD%E6%96%87"。

由于URL中好多字符是保留字,他们在URL中具有特殊的含义。如“&”表示参数分隔符,如果想要在URL中使用这些保留字,那就得对他们进行编码。

对URL中属于ASCII字符集非保留字不做编码;

对URL中的保留字需要取其ASCII内码,然后加上“%”前缀将该字符进行替换(编码);

对URL中的非ASCII字符需要取其Unicode内码,然后加上“%”前缀将该字符进行替换(编码)。

由于这种编码是采用“%”加上字符内码的方式,所以,有些地方也称其为“百分号编码”。

接下来总结一下URL编码混乱的场景有哪些:

情况1:网址路径中包含汉字: 使用的是utf-8编码;

情况2:查询字符串包含汉字; 用的是操作系统的默认编码。

情况3:Get方法生成的URL包含汉字;由HTML源码中字符集的设定决定;GET和POST方法的编码,用的是网页的编码。

情况4:Ajax调用的URL包含汉字;在Ajax调用中,IE总是采用GB2312编码(操作系统的默认编码),而Firefox总是采用utf-8编码。

使用Javascript先对URL编码,然后再向服务器提交,不要给浏览器插手的机会。

因为Javascript的输出总是一致的,所以就保证了服务器得到的数据是格式统一的。

无论网页的原始编码是什么,一旦被Javascript编码,就都变为unicode字符。

也就是说,Javascipt函数的输入和输出,默认都是Unicode字符。encodeURI()是Javascript中真正用来对URL编码的函数。它对应的解码函数是decodeURI()。

需要注意的是,它不对单引号'编码。



讨论一下什么是字符集,字符编码,编码和解码:

字符集:
将一些自然语言中的字符组成一个集合;

字符编码:
字符编码,就是建立一套自然语言中的“字符”跟计算机能够存储 处理的二进制数的映射的规则。
即在一个字符集内,用一个特定的二进制数表示一个唯一“字符”,类似于学号跟学生的映射关系。

为什么需要编码
当数据不利于处理、存储的时候,就需要对它们进行编码。
对字符进行编码是因为自然语言中的字符不利于计算机处理和存储。

编码和解码
根据实际需求的差异,编码、解码算法有可能会很复杂,也有可能非常的简单,
但是从根本上来讲,编码、解码只是在做翻译工作,将一种形式的数据翻译为另一种形式的数据
如,最简单的编码、解码就是相当于从一个Map中根据key查找value,然后使用value代替实际数据中的key的值。



参考链接:

URL编码与解码:https://www.cnblogs.com/Wahitler/p/4761373.html

URL编解码:https://www.jianshu.com/p/e4839089b6ef

关于URL编码:http://www.ruanyifeng.com/blog/2010/02/url_encoding.html

原文地址:https://www.cnblogs.com/grooovvve/p/14158826.html