urlencode编码:就是将字符串以URL编码,一种编码方式,主要为了解决url中中文乱码问题。
例如:
String mytext = java.net.URLEncoder.encode(”中国”, ”utf-8”) //urlencode编码
String mytext2 = java.net.URLDecoder.decode(mytext, ”utf-8”) //urlencode解码
这两条语句在同一个页面中的话,得到的结果是:
mytext: %E4%B8%AD%E5%9B%BD
mytex2: 中国
Urlencode问题
使用base64的初衷。是为了方便把含有不可见字符串的信息用可见字符串表示出来
我们知道在计算机中任何数据都是按ascii码存储的,而ascii码的128~255之间的值是不可见字符。
而在网络上交换数据时,比如说从A地传到B地,往往要经过多个路由设备,由于不同的设备对字符的处理方式有一些不同,这样那些不可见字符就有可能被处理错误,这是不利于传输的。所以就先把数据先做一个Base64编码,统统变成可见字符,这样出错的可能性就大降低了。
urlencode
url编码主要是为了解决一些url中的一些特殊字符和歧义字符或者中文字符的传输问题,
1. base64编码里面有一个 “+” 号,在urlecode编码中 “+” 会被解码成空格,urlencode时,”+” 号肯定是由空格编码出来的,但是base64编码的结果中 ”+” 不是空格编码出来的,如果将base64编码作为安全的url编码使用,则 “+” 将被解码成空格,这是我们不愿看到的; 所以不要base64编码作为url编码来使用.
2. 我们知道http头里面可能会用base64编码来传输一些信息,因为这些信息不会被web服务器默认做url解码的,我们可以得到原始的编码信息, 所以http头里面使用base64编码是可以接受的 。
用base64编码后再进行URL编码,再传输可能会避免此类问题。
Base64编码将二进制数据按照每三个字节转换成四个字节可读字符,编码后的字符长度大约为136.1%。字符范围为 A-Z a-z 0-9 \ +。但编码后的字符串不太适合使用URL传输,中文加密后的乱码也多是因为这个原因引起:放在url中传输时+号会被替换成空格;并且每76个字符都会添加一个换行”\n”,这个换行符合会丢失。
例如:
哈哈哈哈哈哈。。。。
会被编码为:
uf65/rn+uf65/rn+oaOho6GjDQoNCrn+uf65/rn+uf65/qGjoaOhow0KDQq5/rn+uf65/rn+uf6h\no6GjoaM=
放在URL中传输时会变成(不是urlencode的意思,并没有urlencode)
uf65/rn uf65/rn oaOho6GjDQoNCrn uf65/rn uf65/qGjoaOhow0KDQq5/rn uf65/rn uf6h
o6GjoaM=
解析肯定会出问题。
所以在传输和解密时要做如下处理:
1.去掉\n
2.替换空格为+
获取到的请求数据
eyJqb3NfcGFyYW1ldGVycyI6eyJhcHBfa2V5IjoiNDUyNDJFMkU0QjA3RTNCODcyRDExNjM1MTUyRjY1MzIiLCJlbmRfZGF0ZSI6MTQ2OTgwODAwMDAwMCwiaXRlbV9jb2RlIjoiRldfR09PRFMtNDY4MTAtMSIsInVzZXJfbmFtZSI6IueIseWxi awj WumOaWueaXl iIsOW6lyIsInZlcnNpb25fbm8iOjF9fQ==
Base64编码 使用的字符包括大小写字母各26个,加上10个数字,和加号“+”,斜杠“/”,一共64个字符,等号“=”用来作为后缀用途。
其中的+, /, = 都是需要urlencode的,所以无法取代。
不能,base64有转码功能:
由于 ASCII 码称为了国际标准,所以我们要把其它字符转成 ASCII 就要用到 base64。
utf-8 ->base64(编码) ->ASCII
ASCII ->base64(解码) ->utf-8
这样就可以让只支持 ASCII 的计算机支持 utf-8 了。
参考: https://juejin.im/post/5b7d50106fb9a019d7475785
为什么需要urlEncode
1、Base64加密后的数据,如果包含加号,通过http传到后端后会出现解析异常。
2、后端的数据经过urlencode传给前端,前端拿到的数据是编译过的;
而前端把经过urlencode的数据传给后端,后端会自动将数据进行decode解析。
3、后端Java对参数进行urlencode和decode
4、前端对参数进行urlencode和decode
字符串数据以url的形式传递给web服务器时,对字符是有限制的。为了符合url的规范,这些被限制的字符,就需要被转义。比方说:把一个邮箱放入url就需要转义,因为邮箱中包含限制字符 @ 。
在标准的url规范中,中文和很多的字符是不允许出现在url中的。这些需要转义的字符都将被替换成 % 后跟两位十六进制数。
这些字符都是不可打印的,自然需要进行转化。
例如:emoji字符👴🏻👮🏽,转化也是理所当然的。
url中的分隔符包含主要分隔符 :#[]@?/ 和次要分隔符 !$&'()*+,= 。对于url的 query 参数和值,如果在分隔符的包含范围内,除了 ? 和 / 外,都需要转义。例如:对于原始url https://www.baidu.com?paramA=哈哈&paramB=&来说, 哈哈 和 paramB=&中的 &就需要参与转义。否则,对于 &来说,你认为它是一个参数值,还是url本身的分隔符呢?
例如:空格。为了避免歧义,需要被转化成 + 或者 %20 。具体转换成 + 还是 %20 主要依据不同的转换标准。
AFURLRequestSerialization 的源码很好地说明了转义的过程和规则:
以上就是关于什么是urlencode编码全部的内容,如果了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!