为什么要对url进行encode

2024-05-14

1. 为什么要对url进行encode

.encodeURL函数主要是来对URI来做转码,它默认是采用的UTF-8的编码.
. UTF-8编码的格式:一个汉字来三个字节构成,每一个字节会转换成16进制的编码,同时添加上%号.

假设页面端输入的中文是一个逗中地,按照下面步骤进行解码
1.第一次encodeURI,按照utf-8方式获取字节数组变成[-28,-72-83],对字节码数组进行遍历,把每个字节转化成对应的16进制数,这样就变成了[E4,B8,AD],最后变成[%E4,%B8,%AD]  此时已经没有了多字节字符,全部是单字节字符。
2、第二次encodeURI,进行编码,会把%看成一个转义字符,并不编码%以后字符,会把%编码成%25.把数组最后变成[%25E4,%25B8,%25AD]然后就把处理后的数据[%25E4,%25B8,%25AD]发往服务器端,
当应用服务器调用getParameter方法,getParameter方法会去向应用服务器请求参数
应用服务器最初获得的就是发送来的[%25E4,%25B8,%25AD],应用服务器会对这个数据进行URLdecode操作,应用服务器进行解码的这一次,不管是按照UTF-8,还是GBK,还是ISO-8859,,都能得到[%E4,%B8,%AD],因为都会把%25解析成%.并把这个值返回给getParameter方法
3\、再用UTF-8解码一次,就得到"中"了。
想想看,如果不编码两次,当服务器自动解码的时候,假如是按照ISO-8859去解码UTF-8编码的东西,就是会出现乱码。
JS:
[sql] view plain copy
document.authorityForm.action = basePath3+"User_viewUser.do?id="+id+"&roleName="+encodeURI(encodeURI(roleName))+"&roleType="+roleType;  

Java后台:
   
[sql] view plain copy
roleName = java.net.URLDecoder.decode(getRequest().getParameter("roleName"),"UTF-8");

为什么要对url进行encode

2. urlencoded怎么读

urlencoded的读音是/juː ,ɑː(r) ,el ,ɪnˈkəʊdɪd/。URL encoded是url编码的意思。
URL编码:
1、url编码是一种浏览器用来打包表单输入的格式。浏览器从表单中获取所有的name和其中的值 ,将它们以name/value参数编码(移去那些不能传送的字符,将数据排行等等)作为URL的一部分或者分离地发给服务器。不管哪种情况,在服务器端的表单输入格式样子像这样:theName=Ichabod+Crane&gender=male&status=missing& ;headless=yes。

2、URL编码遵循下列规则: 每对name/value由&;符分开;每对来自表单的name/value由=符分开。如果用户没有输入值给这个name,那么这个name还是出现,只是无值。任何特殊的字符(就是那些不是简单的七位ASCII,如汉字)将以百分符%用十六进制编码,当然也包括象 =,&;,和 % 这些特殊的字符。其实url编码就是一个字符ascii码的十六进制。不过稍微有些变动,需要在前面加上“%”。比如“\”,它的ascii码是92,92的十六进制是5c,所以“\”的url编码就是%5c。

3. 为什么要对url进行encode

这个问题涉及到URL的定义。我们知道URL是为了 统一的命名网络中的一个资源(URL不是单单为了HTTP协议而定义的,而是网络上的所有的协议都可以使用)。

所以这就要求URL有一些基本的特性:

1、URL是可移植的。(所有的网络协议都可以使用URL)
2、URL的完整性。(不能丢失数据,比如URL中包含二进制数据时,如何处理)
3、URL的可阅读性。(希望人能阅读)
因为一些历史的原因URL设计者使用US-ASCII字符集表示URL。(原因比如ASCII比较简单;所有的系统都支持ASCII)

为了满足URL的以上特性,设计者就将转义序列移植了进去,来实现通过ASCII字符集的有限子集对任意字符或数据进行编码。

以下是RFC3986中对转义部分的一些定义:

Reserved characters are those characters that sometimes have special meaning。
Unreserved characters have no such meanings。
就是说在RFC3986中Unreserved characters部分的字符是不需要转义的其他都需要。

PS:不同的编程语言对于URL的转义还不一样。比如Java中的URLEncoder是按照RFC2398转义,PHP5中的rawurlencode是按照RFC3986转义。

作者:秋水
来源:知乎

为什么要对url进行encode

4. 为什么要进行URL编码

你可以看看url地址栏一般是找不到中文这些的,都会被转为奇怪的字符,你可以自己试试。
作用有以下几点:
1:URL编码平时是用不到的,因为IE会自动将输入到地址栏的非数字字母转换为url编码。曾有人提出数据库名字里带上“#”以防止被下载,因为IE遇到#就会忽略后面的字母。破解方法很简单——用url编码%23替换掉#。现在SQL注射非常流行,所以就有人写了一些防注射的脚本。下面××SQL通用防注入asp版部分代码。

2:url编码是一种浏览器用来打包表单输入的格式。浏览器从表单中获取所有的name和其中的值 ,将它们以name/value参数编码(移去那些不能传送的字符, 将数据排行等等)作为URL的一部分或者分离地发给服务器。不管哪种情况, 在服务器端的表单输入格式样子象这样:

theName=Ichabod+Crane&gender=male&status=missing&headless=yes

这是一个专门对地址栏里所传递的参数进行编码的规则。
比如在参数中带有空格的话,传递参数时就会发生错误,而用URL编码过以后,空格变成了%20这样就不会发生错误了;另外中文字经编码后全是怪符号,有利于保密。
这个编码后的字串提交给服务器后是不需要解码的,网页会自动识别.

URL编码遵循下列规则: 每对name/value由&符分开;每对来自表单的name/value由=符分开。如果用户没有输入值给这个name,那么这个name还是出现,只是无值。任何特殊的字符(就是那些不是简单的七位ASCII,如汉字)将以百分符%用十六进制编码,当然也包括象 =, &, 和 % 这些特殊的字符。
3:转换编码后的url全世界可以通用,跨平台跨系统,因为有些系统不支持中文。

5. URL编码的编码规则

URL编码遵循下列规则: 每对name/value由&;符分开;每对来自表单的name/value由=符分开。如果用户没有输入值给这个name,那么这个name还是出现,只是无值。任何特殊的字符(就是那些不是简单的七位ASCII,如汉字)将以百分符%用十六进制编码,当然也包括象 =,&;,和 % 这些特殊的字符。其实url编码就是一个字符ascii码的十六进制。不过稍微有些变动,需要在前面加上“%”。比如“\”,它的ascii码是92,92的十六进制是5c,所以“\”的url编码就是%5c。那么汉字的url编码呢?很简单,看例子:“胡”的ascii码是-17670,十六进制是BAFA,url编码是“%BA%FA”。

URL编码的编码规则

6. URL 如何编码解码?为什么要编码?

 原因很简单,因为 URL 只能使用 ASCII 字符集来通过因特网进行发送, 不支持中文!!不支持中文!! 
                                           在浏览器中的 URL 所展现的样式包含有中文字符,但是当你将这行 URL 复制粘贴时你就会发现,实际上的内容和你所看到的是不一样的。
                                           所以说 URL 编码只是针对非英文字母、阿拉伯数字和某些标点符号起作用的。
   URL 编码的原则就是使用安全的字符(没有特殊用途或者特殊意义的可打印字符)去表示那些不安全的字符。
   例如说我们有这样一条 URL : www.hahaha.com/你好?a=1&b=2 ,我们如何可以把它合法的在因特网中传播呢??
   使用  encodeURIComponent(str)  这个方法来将 utf-8 的字符编码为合法的 URL 。
   上面的那条网址合法的传输形式为  window.encodeURIComponent('www.hahaha.com/你好?a=1&b=2')  。
                                           想要解码的时候只需要使用  decodeURIComponent(str)  这个方法就可以解码你所得到的   URL 。
   同样还是刚才的网址,我们得到解码后的网址为  www.hahaha.com%2F%E4%BD%A0%E5%A5%BD%3Fa%3D1%26b%3D2  ,我们想要得到一个可读性比较高的网址,只需要  decodeURIComponent('www.hahaha.com%2F%E4%BD%A0%E5%A5%BD%3Fa%3D1%26b%3D2')  。
                                           如果哪天所有字符都可以在因特网内直接发送的话,可能就不需要在对 URL 进行编码和解码了......

7. url如何编码解码?为什么要编码?

 一般来说,URL只能使用英文字母、阿拉伯数字和某些标点符号,不能使用其他文字和符号,这是因为网络标准 RFC 1738 做了硬性规定。如果URL中有汉字,就必须编码后使用。但是麻烦的是,RFC 1738没有规定具体的编码方法,而是交给应用程序(浏览器)自己决定,这导致"URL编码"成为了一个混乱的领域。   四种导致混乱的情况:   网址路径中包含汉字   查询字符串包含汉字   Get方法生成的URL包含汉字   Ajax调用的URL包含汉字(在Ajax调用中,IE总是采用GB2312编码(操作系统的默认编码),而Firefox总是采用utf-8编码。)   综上所述,这个时候需要一种编码方法向服务器发送请求,而js则可以满足这一需求。
   decodeURI()   decodeURIComponent()   encodeURI()   encodeURIComponent()  (一般使用encodeURI()和encodeURIComponent())
   encodeURI()是Javascript中真正用来对URL编码的函数。它着眼于对整个URL进行编码,因此除了常见的符号以外,对其他一些在网址中有特殊含义的符号"; / ? : @ & = + $ , #",也不进行编码。编码后,它输出符号的utf-8形式,并且在每个字节前加上%。
                                           它对应的解码函数是decodeURI()
                                           与encodeURI()的区别是,它用于对URL的组成部分进行个别编码,而不用于对整个URL进行编码。因此,"; / ? : @ & = + $ , #",这些在encodeURI()中不被编码的符号,在encodeURIComponent()中统统会被编码。至于具体的编码方法,两者是一样。
                                           它对应的解码函数是decodeURIComponent()。
   encodeURIComponent比encodeURI编码的范围更大。   举例来说,encodeURIComponent会把 http:// 编码成 http%3A%2F%2F 而encodeURI却不会。    如果你需要编码整个URL,然后需要使用这个URL,那么用encodeURI,否则使用encodeURIComponent。 

url如何编码解码?为什么要编码?

最新文章
热门文章
推荐阅读