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